首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

一道面试题,该怎么解决

2013-10-21 
一道面试题将1-100放入10X10的二维数组当中,放置规则如下:面试官说如果这种题40秒钟之内没有想法,就不要做

一道面试题
将1-100放入10X10的二维数组当中,放置规则如下:
一道面试题,该怎么解决
面试官说如果这种题40秒钟之内没有想法,就不要做开发了。在cocoachina上已经发过了。
[解决办法]
自己写了一个,发现代码有点傻,还是不要发出来一道面试题,该怎么解决
[解决办法]
能向右走就向右走,不能向右走就向下走,不能向下走就向左走,不能向左走就向上走,不能向上走就向右走
[解决办法]
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秒钟很肯定地给出说“某某做法已定行!”
[解决办法]
哈哈,发现“果然很傻”。

那么可以先简单地重构一下:
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秒......”背后的意思。
[解决办法]
一道面试题,该怎么解决不做开发,回家养猪算了
[解决办法]
这个有什么好想的,四个方向表示四种赋值方法依次循环,循环条件是超出长度或已赋值就进入下一种方法

热点排行