算法面试题

上一篇博客中有原有提到分享一下面试题,最近也是才能新公司入职没多久,忙着熟悉环境,加上前不久出去玩了一趟(顺便写了篇游记,感兴趣的可以看一看)。所以一直没时间整理博客,这段时间周末终于闲下来,就趁着周末就记录了几个面试过程中碰到的算法题。

本篇博客不打算介绍那些高逼格的算法(如winnow,bagging,ada boost等等),就讲讲最近在面试过程中遇到的算法题以及面试的时候给出的答案(出场率比较高的算法题我都列出来了,其他的就不说了)。算法可以说是解决所有问题的基石。很多东西都可以转换为算法问题,学习算法最大的作用就是更清楚地了解了很多东西。正所谓是,知其然更知其所以然。很多人都觉得程序就是数据结构+算法+适当的注释。不学算法,那就不要学编程了。虽然说可能没这么夸张,因为实际上还是有很多小项目是不需要太多算法的,都是代码一个劲的往上叠加就行了。但是就算没那么夸张,但是作为一个程序员,逻辑思维就是算法的思路还是很重要的。---这段话是某公司一个面试官说的。

v写在前面

再次重申一下,这里只是列出一些最近遇到的算法面试题,拿出来给大家分享一下面试经历(仅是常见算法方面的经历,还有一些不常见的就懒得列举了,技术方向的不介绍)。还有就是我的答案。ps:无论是算法题还是答案都不具任何代表性也并非是正确答案,仅仅是我面试的时候给出的答案,只是分享而已。另外,对于我所列出的问题以及给出的答案,如果有园友有疑议或者是更好的解决办法,那就分享出来! 写算法是一个非常过瘾的享受!

顺便说一嘴,因为有一次面试面试官是在伦敦,所以只能远程面试,我们是用collabedit,这个东东还是很受用的。

v算法百科

----算法百科摘自百度百科(ps:不摘点介绍性的文字在这,直接开门见山的来题目。感觉有点duangduang的。性急的可以直接跳过此处!)

算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。 算法中的指令描述的是一个计算,当其运行时能从一个初始状态和(可能为空的)初始输入开始,经过一系列有限而清晰定义的状态,最终产生输出并停止于一个终态。一个状态到另一个状态的转移不一定是确定的。随机化算法在内的一些算法,包含了一些随机输入。 形式化算法的概念部分源自尝试解决希尔伯特提出的判定问题,并在其后尝试定义有效计算性或者有效方法中成形。这些尝试包括库尔特·哥德尔、Jacques Herbrand和斯蒂芬·科尔·克莱尼分别于1930年、1934年和1935年提出的递归函数,阿隆佐·邱奇于1936年提出的λ演算,1936年Emil Leon Post的Formulation 1和艾伦·图灵1937年提出的图灵机。即使在当前,依然常有直觉想法难以定义为形式化算法的情况。

v算法题目

  • 第一题:在一个已经排序的Int数组中,查找某个number,如果存在这个number,返回在数组的位置,反之返回-1 查看博主面试答案
  • 第二题:{"12,bob","3,sky","6,cool","1,good","22,go"},按元素第一列排序 查看博主面试答案
  • 第三题:字符串数组去除重复项 查看博主面试答案
  • 第四题:将一个未排序的整形数组进行归置,数组中的负数移动到数组的左边,正数移动到数组的右边。0不动(ps:我一开做这题就打算用无脑排序搞定,结果我才开始写,面试官就说了"这里需要提示一下,移动后的数组只是负数在左,正数在右。不一定非要用传统的排序,如果不是传统的排序可以加分。") 查看博主面试答案

所有答案仅供参考,并非标准或者正确答案,只是在面试的时候给出的答案而已,所以欢迎大家给出更好的答案

所有答案都是面试的时候notepad写的,回来以后我没有double check,直接贴出了代码,其中有一部分我后面附加了图。如果大家有兴趣,我也建议大家可以先用notepad写写看,因为算法这种东西本身就是一个思路而已。没必要用vs。

v参考答案

第一题

//------------------------------------------------------------------------------
// <copyright file="Runner.cs" company="CNBlogs Corporation" owner="请叫我头头哥">
//     Copyright (C) 2015-2016 All Rights Reserved
//     原博文地址: http://www.cnblogs.com/toutou/
// </copyright>
//------------------------------------------------------------------------------
namespace TestApp
{
    using System;
    using System.Collections.Generic;
    using System.Text.RegularExpressions;
    class Runner
    {
        static void Main(string[] args)
        {
            int[] arr = { 3, 5, 6, 7, 8, 9, 14, 23, 45, 56, 63, 72, 87, 91, 92, 93, 95, 97, 98, 534, 555, 676, 878, 988, 1365 };
            int number = 555;
            int result = Search(arr, number);
            Console.WriteLine(result);
            Console.ReadKey();
        }
        public static int Search(int[] arr, int number)
        {
            int result = 0;
            if (arr == null || arr.Length == 0 || number > arr[arr.Length - 1] || number < arr[0])
            {
                result = -1;
            }
            else
            {
                result = Bisearch(arr.Length - 1, arr, number);
            }
            return result;
        }
        public static int Bisearch(int endIndex, int[] arr, int number, int startIndex = 0)
        {
            int result = 0;
            if ((endIndex - startIndex) < 2)
            {
                for (int i = startIndex; i <= endIndex; i++)
                {
                    if (arr[i] == number)
                    {
                        result = i;
                        break;
                    }
                    else
                    {
                        result = -1;
                    }
                }
            }
            else
            {
                if (arr[startIndex] <= number && number <= arr[(endIndex + startIndex) / 2])
                {
                    Bisearch((endIndex + startIndex) / 2, arr, number, startIndex);
                }
                else
                {
                    Bisearch(endIndex, arr, number, (endIndex + startIndex) / 2 + 1);
                }
            }
            return result;
        }
    }
}

关于这题我在面试回来的路上,构思了一下思路,大致是这样的:

当然,我这个肯定不是最好的solution。

返回题库第一题我有不一样的看法

第二题

namespace TestApp
{
    using System;
    using System.Text.RegularExpressions;
    class Program
    {
        static void Main(string[] args)
        {
            string[] source = new string[] { "12,bob", "3,sky", "6,cool", "1,good", "22,go" };
            for (int i = 0; i < source.Length; i++)
            {
                for (int j = i; j < source.Length; j++)
                {
                    if (Convert.ToInt32(Regex.Match(source[i], @"\d+").Value) > Convert.ToInt32(Regex.Match(source[j], @"\d+").Value))
                    {
                        string temp = source[i];
                        source[i] = source[j];
                        source[j] = temp;
                    }
                }
            }
            for (int i = 0; i < source.Length; i++)
            {
                Console.WriteLine(source[i]);
            }
        }
    }
}

这一题我选择的是用比较笨的正则取出数字,然后用冒泡排序完成的算法。后来回来想了想,实在是不应该啊!这里就上一张传统的冒泡排序视觉效果图。

返回题库第二题我有不一样的看法

第三题

namespace TestApp
{
    using System;
    class Program
    {
        static void Main(string[] args)
        {
            string[] source = { "aaa", "bbb", "aaa", "ccc", "bbb", "ddadd", "ccc", "aaa", "bbb", "ddd" };
            foreach (var item in ArrDistinct(source))
            {
                Console.WriteLine(item);
            }
        }
        public static String[] ArrDistinct(string[] source)
        {
            if (source != null && source.Length > 0)
            {
                Array.Sort(source);
                int size = 1;
                for (int i = 1; i < source.Length; i++)
                    if (source[i] != source[i - 1])
                        size++;
                string[] tempArr = new string[size];
                int j = 0;
                tempArr[j++] = source[0];
                for (int i = 1; i < source.Length; i++)
                    if (source[i] != source[i - 1])
                        tempArr[j++] = source[i];
                return tempArr;
            }
            return source;
        }
    }
}
//因为这题的主要考点在字符串数组去重,所以排序我就没太在意,直接用的系统排序。当然,这样是很不专业的。不过如果有必要的话,这里也可以先用算法排序字符串,然后再用我这个办法。 至于算法排序字符串,我能想到的比较"卑鄙"的办法就只有先将字符串数组转成char再转成int数组,
Array.ConvertAll<string, int>(strArray, s => int.Parse(s));
//再排序,大神你有更好的办法?有就不要藏着掖着了,来吧!

返回题库第三题我有不一样的看法

第四题

public int[] IntArrSort(int[] source)
        {
            if (source == null || source.Length == 0)
                return source;
            int rightIndex = source.Length - 1, tempNumber = 0;
            for (int i = 0; i < source.Length; i++)
            {
                if (i > rightIndex)
                    break;
                if (source[i] <= 0)
                {
                    continue;
                }
                else if (source[i] > 0)
                {
                    for (int j = rightIndex; j >= 0; j--)
                    {
                        if (source[j] < 0)
                        {
                            tempNumber = source[j];
                            source[j] = source[i];
                            source[i] = tempNumber;
                            rightIndex = j;
                            break;
                        }
                    }
                }
            }
            return source;
        }



算法面试题

时间: 2024-11-11 19:23:13

算法面试题的相关文章

数据结构与算法面试题80道

由于这些题,实在太火了.所以,应广大网友建议要求,在此把之前已整理公布的前80题, 现在,一次性分享出来.此也算是前80题第一次集体亮相. 此些题,已有上万人,看到或见识到,若私自据为己有,必定为有知之人识破,付出代价. 所以,作者声明: 本人July对以上所有任何内容和资料享有版权,转载请注明作者本人July出处. 向你的厚道致敬.谢谢. ------------------------------------------------------------------------------

若干数据结构 && 算法面试题【四】(更新ing)

这是我的第三个面试题汇总. 想看之前的内容,请移步: http://zhweizhi.blog.51cto.com/10800691/1763237 ( 若干数据结构 && 算法面试题[一](更新完毕)) http://zhweizhi.blog.51cto.com/10800691/1775780 ( 若干数据结构 && 算法面试题[二](更新完毕)) http://zhweizhi.blog.51cto.com/10800691/1787562 ( 若干数据结构 &am

若干数据结构 && 算法面试题【三】(更新中)

这是我的第三个面试题汇总. 想看之前的内容,请移步: http://zhweizhi.blog.51cto.com/10800691/1763237 ( 若干数据结构 && 算法面试题[一](更新完毕)) http://zhweizhi.blog.51cto.com/10800691/1775780 ( 若干数据结构 && 算法面试题[二](更新完毕)) 另外,我的全部刷题代码都在这里: https://github.com/HonestFox/BrushQuestion

九章算法面试题43 直方图内最大矩阵

九章算法官网-原文网址 http://www.jiuzhang.com/problem/43/ 题目 给出一个直方图(如图所示),求出所给直方图中所包含的最大矩阵面积.直方图可以用一个整数数组表示,如上图为[2, 1, 5, 6, 2, 3].每个直方块的宽度均为1.上图中包含的最大矩阵面积为10. 解答 如果对于每个直方块,找到从它开始往左边数第一个比它小的,和往右边数第一个比他小的,则可以确定出以该直方块为最矮一块的矩阵的最大面积.使用数据结构栈,栈中保存递增序列,从左到右依次遍历每个数让其

九章算法面试题31 子数组的最大差

九章算法官网-原文网址 http://www.jiuzhang.com/problem/31/ 题目 给定一个数组,求两个不相交的并且是连续的子数组A和B(位置连续),满足|sum(A) - sum(B)|最大(和之差的绝对值).例如[2, -1, -2, 1, -4, 2, 8],可以得到A=[-1, -2, 1, -4], B=[2, 8],最大差为16. 解答 预处理每个位置往左/右的最大/最小子数组,然后再枚举划分位置,求得所有MaxLeft[i] - MinRight[i+1]和Max

九章算法面试题37 主元素

九章算法官网-原文网址 http://www.jiuzhang.com/problem/37/ 题目 主元素(Majority Number)定义为数组中出现次数严格超过一半的数.找到这个数.要求使用O(1)的额外空间和O(n)的时间. 进阶1:如果数组中存在且只存在一个出现次数严格超过1/3的数,找到这个数.要求使用O(1)的额外空间和O(n)的时间. 进阶2:如果数组中存在且只存在一个出现次数严格超过1/k的数,找到这个数.要求使用O(k)的额外空间和O(n)的时间 解答 采用抵消法.一旦发

九章算法面试题40 不用除法求积

九章算法官网-原文网址 http://www.jiuzhang.com/problem/40/ 题目 给定一个数组A[1..n],求数组B[1..n],使得B[i] = A[1] * A[2] .. * A[i-1] * A[i+1] .. * A[n].要求不要使用除法,且在O(n)的时间内完成,使用O(1)的额外空间(不包含B数组所占空间). 解答 计算前缀乘积Prefix[i] = A[1] * A[2] .. A[i],计算后缀乘积Suffix[i] = A[i] * A[i+1] ..

九章算法面试题50 队列上实现Min函数

九章算法官网-原文网址 http://www.jiuzhang.com/problem/50/ 题目 ?在<九章算法面试题23 栈上实现Min函数>中,我们介绍了在栈上实现一个O(1)的Min方法.那么,如何在队列上实现一个Min方法? 要求,队列除了支持基本的Push(x) Pop()的方法以外,还需要支持Min方法,返回当前队列中的最小元素.每个方法的均摊复杂度为O(1) 解答 在九章面试题49<用栈实现队列>和面试题23<栈上实现Min函数>中,我们讲解到了如何用

大数据量的算法面试题(转)

作者:July.youwang.yanxionglu.时间:二零一一年三月二十六日说明:本文分为俩部分,第一部分为10道海量数据处理的面试题,第二部分为10个海量数据处理的方法总结.有任何问题,欢迎交流.指正.出处:http://blog.csdn.net/v_JULY_v.   第一部分.十道海量数据处理面试题 1.海量日志数据,提取出某日访问百度次数最多的那个IP. 首先是这一天,并且是访问百度的日志中的IP取出来,逐个写入到一个大文件中.注意到IP是32位的,最多有个2^32个IP.同样可