记一次笔试面试题之算法

      快到年底了,考虑到一些情况,加之现在工作业务没那么多了,本着想在技术上想在多学点东西的想法,突然间萌生了想换工作的想法,恰好一不错的公司Hr给我说他们在招人,于是我就偷偷的给了份简历,时隔几天她给了我一份笔试题,我一看有算法题,这是我最头疼的问题,我不反对面试算法,但是我感觉很多用人单位还是要本着自己的业务水平去面试,招适合本公司业务处理,相对比较实用又符合发展的人才就行了,当你真正拿出一些很高深的算法去面试的时候,我感觉你要看看你开出来招人的预算是不是能达到答出来这些题的待遇,是不是你现在的业务就需要这么高深的技术支撑,同时是不是能给一些比方说像我这种级别低点的大众化程序员次机会!下面我列出面试题也求园里的高手求解下,本人求知若渴,只想做在技术上的交流,因为我确实在算法上很不在行,本着虚心求教的态度,我想在这方面多学习下。

       要求30分钟
      编程语言不限,允许有小的语法错误;
      在程序前面简单写出编程思路;
      1、编写一个函数,不用临时变量,直接交换两个数。
      2、用数组实现一个容量为n的队列,要求进队列和出队列的时间复杂度都为O(1)。
      3、写一个函数,在给定的n个数字中,找出最小的m个,其中m<n。请一并给出算法的时间复杂度。

      一下是我发给他们的答案

     

class Program
    {
        static void Main(string[] args)
        {
            //第一题  
            int numA = 321;
            int numB = 8765;
            numA = numA ^ numB;
            numB = numB ^ numA;
            numA = numA ^ numB;
            Console.WriteLine(numA);
            Console.WriteLine(numB);

            //第二题
            var n = 100;
            var arr = new string[n];
            var index = 0;
            var last = 0;
            //入队列
            Action<string> push = s =>
            {
                var nIndex = index + 1;
                nIndex = nIndex == n ? 0 : nIndex;
                if (nIndex == last)
                {
                    Console.WriteLine("队列已满");
                    return;
                }

                arr[index] = s;
                index = nIndex;
            };

            ///出队列
            Func<string> pop = () =>
            {
                string result;
                if (index == last)//队列中无数据
                {
                    result = null;
                }
                result = arr[last];
                last++;
                last = last == n ? 0 : last;
                return result;
            };
            push("AAA");
            push("BBB");
            push("CCC");
            push("DDD");
            Console.WriteLine(pop());
            Console.WriteLine(pop());
            Console.WriteLine(pop());
            Console.WriteLine(pop());


            //第三题  算法复杂度O(n) 因为时间关系目前只支持正整数
             int[] arrInt = new[] { 1, 2, 4, 6, 8, 9, 4, 2, 4, 7, 9 };
             int n1 = arrInt.Length;

            Func<int, int[]> func = m =>
            {
                var max = 0;
                foreach (var item in arrInt)
                {
                    max = max < item ? item : max;
                }
                var nArr = new bool[max + 1];
                foreach (var item in arrInt)
                {
                    nArr[item] = true;
                }
                var result = new int[m];
                var indexInt = 0;
                for (var i = 0; i < nArr.Length; i++)
                {
                    if (nArr[i])
                    {
                        result[indexInt] = i;
                        indexInt++;
                    }
                    if (indexInt == m)
                    {
                        break;
                    }
                }
                return result;
            };
            var tmp = func(3);
            foreach (var item in tmp)
            {
                Console.WriteLine(item);
            }


            Console.ReadKey();

        }
    }

以上是我给过去的答案,最后的结果是没通过,但是我也不能在厚着脸皮去问为什么了,毕竟那边是人事不是技术,我感觉我第三题的算法可能有问题,我是拿了空间换时间,要是输出重复的就实现不了了,算是我钻了个漏洞吧,哈哈,虽然实现了功能要求,但是我确实不知道怎么写比较好一点,希望园子里的高手能给我指点下,第三题应该怎么写?虽然没通过,但是我也想在一次面试中找到自己的不足,这道题以我目前的水平不足以有更好的写法了,所以想求解更好的答案

posted @ 2014-10-28 23:12  流年莫逝  阅读(2655)  评论(15编辑  收藏  举报