一道面试题
将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;
}
}
}
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;
}
}
}