将1-100放入10X10的二维数组当中,放置规则如下:面试官说如果这种题40秒钟之内没有想法,就不要做开发了。在cocoachina上已经发过了。

解决方案 »

  1.   

    我看了一下时间,我用了3分钟
    看来我做不了开发了
    ——————
    头一次看见这东西,说我的思路,有时间在写全
    这个东西炸一看挺晕,仔细想就是算坐标
    起始位置是(0.0)终止是(99.99),从左上到右下
    现在用变量代替x,y需要一个变量i表示行 
    循环x.x到x=i到y=i-1
    嵌入循环x=x-1-i, y=y-1-i
    同比循环x=x-1-i,y=i
    逆循环,x=i+1,y=i+1
      

  2.   

    40秒内能够有想法,这应该是大多数合格的程序员都能做到。能够有想法,跟测试程序完全正确而结束,是两个概念。也许你需要1小时才能提交你的代码,但是一开始这个想法并不需要20秒钟。这里是一个“很傻的”写法,但是这个想法应该不需要20秒钟就能想出来了。using System;namespace ConsoleApplication1
    {
        static class Program
        {
            static void Main(string[] args)
            {
                var array = new int[10, 10];
                开始填数(array, 0, 0, 1, Direction.向右);
                for (var i = 0; i <= array.GetUpperBound(0); i++)
                {
                    for (var j = 0; j <= array.GetUpperBound(1); j++)
                        Console.Write("{0,3}", array[i, j]);
                    Console.WriteLine();
                }
                Console.ReadKey();
            }        private static void 开始填数(int[,] array, int p1, int p2, int p3, object 向右)
            {
                throw new NotImplementedException();
            }        public enum Direction
            {
                向右, 向下, 向左, 向上
            }        private static void 开始填数(int[,] array, int 行, int 列, int 值, Direction 方向)
            {
                do
                {
                    array[行, 列] = 值++;
                    var x = 同方向x(行, 方向);
                    var y = 同方向y(列, 方向);
                    if (!判断位置可否填数(array, x, y))
                    {
                        x = 换方向x(行, 方向);
                        y = 换方向y(列, 方向);
                        方向 =(Direction)( (int)(方向 + 1) % 4);
                        if (!判断位置可否填数(array, x, y))
                            break;
                    }
                    行 = x;
                    列 = y;
                } while (true);
            }        private static int 换方向y(int 列, Direction 方向)
            {
                switch (方向)
                {
                    case Program.Direction.向上:
                        return 列 + 1;
                    case Program.Direction.向下:
                        return 列 - 1;
                    default:
                        return 列;
                }
            }        private static int 换方向x(int 行, Direction 方向)
            {
                switch (方向)
                {
                    case Program.Direction.向左:
                        return 行 - 1;
                    case Program.Direction.向右:
                        return 行 + 1;
                    default:
                        return 行;
                }
            }        private static int 同方向y(int 列, Direction 方向)
            {
                switch (方向)
                {
                    case Program.Direction.向左:
                        return 列 - 1;
                    case Program.Direction.向右:
                        return 列 + 1;
                    default:
                        return 列;
                }
            }        private static int 同方向x(int 行, Direction 方向)
            {
                switch (方向)
                {
                    case Program.Direction.向下:
                        return 行 + 1;
                    case Program.Direction.向上:
                        return 行 - 1;
                    default:
                        return 行;
                }
            }        private static bool 判断位置可否填数(int[,] array, int 行, int 列)
            {
                return 行 >= 0 && 行 <= array.GetUpperBound(0) && 列 >= 0 && 列 <= array.GetUpperBound(1) && array[行, 列] == 0;
            }    }
    }事实上许多程序员表面上看“没有想法”,是因为没有学会“表达”,因而怯场。这需要训练,这说明他们的聪明是来自于死记硬背,如果他的聪明是经过训练的创造力,那么他就一定可以在20秒钟很肯定地给出说“某某做法已定行!”
      

  3.   

    哈哈,发现“果然很傻”。那么可以先简单地重构一下:using System;namespace ConsoleApplication1
    {
        static class Program
        {
            static void Main(string[] args)
            {
                var array = new int[10, 10];
                开始填数(array, 0, 0, 1, Direction.向右);
                for (var i = 0; i <= array.GetUpperBound(0); i++)
                {
                    for (var j = 0; j <= array.GetUpperBound(1); j++)
                        Console.Write("{0,3}", array[i, j]);
                    Console.WriteLine();
                }
                Console.ReadKey();
            }        public enum Direction
            {
                向右, 向下, 向左, 向上
            }        private static void 开始填数(int[,] array, int 行, int 列, int 值, Direction 方向)
            {
                do
                {
                    array[行, 列] = 值++;
                    var x = 同方向x(行, 方向);
                    var y = 同方向y(列, 方向);
                    if (!判断位置可否填数(array, x, y))
                    {
                        方向 = (Direction)((int)(方向 + 1) % 4);
                        x = 同方向x(行, 方向);
                        y = 同方向y(列, 方向);
                        if (!判断位置可否填数(array, x, y))
                            break;
                    }
                    行 = x;
                    列 = y;
                } while (true);
            }        private static int 同方向y(int 列, Direction 方向)
            {
                switch (方向)
                {
                    case Program.Direction.向左:
                        return 列 - 1;
                    case Program.Direction.向右:
                        return 列 + 1;
                    default:
                        return 列;
                }
            }        private static int 同方向x(int 行, Direction 方向)
            {
                switch (方向)
                {
                    case Program.Direction.向下:
                        return 行 + 1;
                    case Program.Direction.向上:
                        return 行 - 1;
                    default:
                        return 行;
                }
            }        private static bool 判断位置可否填数(int[,] array, int 行, int 列)
            {
                return 行 >= 0 && 行 <= array.GetUpperBound(0) && 列 >= 0 && 列 <= array.GetUpperBound(1) && array[行, 列] == 0;
            }    }
    }不在改了。这种题目我其实从来不做。我觉得用30分钟还是1个小时还是2个小时提交这个代码,并不重要。重要地势看一个人能不能确定指导自己搞得定所谓的“流程”设计。可能一些经历最烦听到的就是程序员对这种问题说“我不会,所以我很没有压力”。我想这就是lz所说的“40秒......”背后的意思。
      

  4.   


    实际上,只看我写的代码其实是不对的!因为我写的代码本身把lz的问题给搞复杂了。lz的问题集中在“40秒钟内没有想法”上,这其实反映了那些靠死记硬背一些课堂笔记的、没有几年软件基础课程打底的新手的通病。因为那种课程是让学员死记硬背,而不是教会学员设计出比较具体和要点明确的流程图、或者算法伪代码设计。“就不要做开发了”这个说法可能确实有点伤人,但是其实并不过分。可以做个业余的小工,从头学点软件专业基础知识。就怕有些人整天躺在“从csdn抄代码”的意识上,不去进修真正的程序设计知识。