一道面试题 将1-100放入10X10的二维数组当中,放置规则如下:面试官说如果这种题40秒钟之内没有想法,就不要做开发了。在cocoachina上已经发过了。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我看了一下时间,我用了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 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秒......”背后的意思。 实际上,只看我写的代码其实是不对的!因为我写的代码本身把lz的问题给搞复杂了。lz的问题集中在“40秒钟内没有想法”上,这其实反映了那些靠死记硬背一些课堂笔记的、没有几年软件基础课程打底的新手的通病。因为那种课程是让学员死记硬背,而不是教会学员设计出比较具体和要点明确的流程图、或者算法伪代码设计。“就不要做开发了”这个说法可能确实有点伤人,但是其实并不过分。可以做个业余的小工,从头学点软件专业基础知识。就怕有些人整天躺在“从csdn抄代码”的意识上,不去进修真正的程序设计知识。 提交按钮后 逻辑判断弹出 js 如何终止程序继续运行 怎样关闭模式窗口 asp.net 图片压缩后背景变黑色问题 关于asp.net ajax重复调用后台页面方法的异常问题 GridView 合计行问题 为什么这段代码在加载页面的时候会死循环 求救!!sos vs2005中的控件为什么不响应事件:如dropdownlist的onselectedchanged()事件,我双击后在里面写代码,运行时没有反应? 能否快速的将对象保存为一个DataSet? DataGrid中怎样实现鼠标划过变色的效果 问个网站里购买、充值、返回操作的流程问题。 TreeView的问题!点一下节点马上报错
看来我做不了开发了
——————
头一次看见这东西,说我的思路,有时间在写全
这个东西炸一看挺晕,仔细想就是算坐标
起始位置是(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
{
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秒钟很肯定地给出说“某某做法已定行!”
{
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秒......”背后的意思。
实际上,只看我写的代码其实是不对的!因为我写的代码本身把lz的问题给搞复杂了。lz的问题集中在“40秒钟内没有想法”上,这其实反映了那些靠死记硬背一些课堂笔记的、没有几年软件基础课程打底的新手的通病。因为那种课程是让学员死记硬背,而不是教会学员设计出比较具体和要点明确的流程图、或者算法伪代码设计。“就不要做开发了”这个说法可能确实有点伤人,但是其实并不过分。可以做个业余的小工,从头学点软件专业基础知识。就怕有些人整天躺在“从csdn抄代码”的意识上,不去进修真正的程序设计知识。