锁定老帖子 主题:深圳一家公司面试问题,很囧
精华帖 (0) :: 良好帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-12-10
大一的时候做过,确实很麻烦。
|
|
返回顶楼 | |
发表时间:2009-12-10
caiwenhn2008 写道 贴一个可以跑的
class snakePrint { static int length = 7; static int value = 1; static int[][] snake = new int[length][length]; static Direction lastDirection = Direction.Right; static enum Direction { Right, Down, Left, Up; } public static void initialArray() { int row = 0, line = 0; for (int c = 0; c < length * length; c++) { snake[row][line] = value; lastDirection = findDirection(row, line); switch (lastDirection) { case Right: line++; break; case Down: row++; break; case Left: line--; break; case Up: row--; break; default: System.out.println("error"); } value++; } } static Direction findDirection(int row, int line) { Direction direction = lastDirection; switch (direction) { case Right: { if ((line == length - 1) || (snake[row][line + 1] != 0)) direction = direction.Down; break; } case Down: { if ((row == length - 1) || (snake[row + 1][line] != 0)) direction = direction.Left; break; } case Left: { if ((line == 0) || (snake[row][line - 1] != 0)) direction = direction.Up; break; } case Up: { if (snake[row - 1][line] != 0) direction = direction.Right; break; } } return direction; } public static void main(String[] args) { initialArray(); // display..... for (int i = 0; i < length; i++) { for (int j = 0; j < length; j++) { System.out.print(snake[i][j] + " "); } System.out.println(); } } } 牛人啊!我们大四了,前段时间有个面试指导的课,老师就是这种思想做的,但代码量比这多好几倍呢! |
|
返回顶楼 | |
发表时间:2009-12-10
n=8 x=[] (0...n).each do |i| x[i]=[] end # 初始化 def set(n,x,k) start = n*n-(n-2*k+2)*(n-2*k+2)+1 # 每个框框的开始值 step = n-2*k+1 # 每个框框的边长 (0..step).each do |i| # 上边 x[k-1][k+i-1]=start+i end (1..step).each do |i| # 右边 x[k+i-1][k+step-1]=start+step+i end (1..step).each do |i| # 下边 x[k+step-1][k+i-2]=start+3*step-i+1 end (1..step-1).each do |i| # 左边 x[k+i-1][k-1]=start+4*step-i end end (1..n).each do |i| set(n,x,i) end # 从外到里计算框框~~ (1..n).each do |i| p x[i-1].join(" ") end # 打印~~ ruby代码 简略草稿版~~
步骤:设置一个数据来保存,把数组看成一个个的正方形,计算每个正方形里边的值,并打印。。其他都是数学了。。 这题就ACM水平了?远着吧~~
|
|
返回顶楼 | |
发表时间:2009-12-11
最后修改:2009-12-11
我用递归做了一下,不是很好,不过也完成了功能了,呵呵 /* * int baseNum=i 1 2 3 ... i 4i-4 (4i-4)+1 ... (4i-4)+(i-2) i+1 ... ... ... ... i+2 ... (4i-4)+[3(i-2)-2] ... (4i-4)+(i-2)+(i-2-1) ... 3i-2 3i-3 ... 2i i+(i-1) */ /** * * @author */ public class PrintSnakeNumberSquare { public static void printN(int baseNum){ System.out.println("int baseNum="+baseNum); for(int i=0;i<baseNum;i++){ printN_M(baseNum,i,0); System.out.println(); } } /** * 打印baseNum宽度的第row行 * @param baseNum:打印正方形的边长 * @param row:打印正方形的第 row 行 * @param outNumber :这个正方形外面层数所占用的数字个数,最外面一层此值为0; * 长度为n的正方形占用4*n-4个数字,第i层递归需传入前i-1层所占数字总和。 */ public static void printN_M(int baseNum,int row,int outNumber){ if(row==0){//如果是第一行 for(int i=1;i<=baseNum;i++){ System.out.format("%3s",i+outNumber); } return ; } if(row==(baseNum-1)){//如果是最后一行 for(int i=(3*baseNum-2);i>=2*baseNum-1;i--){ System.out.format("%3s", i+outNumber); } return; } //row 如果不是第一行或者最后一行,则可以分为三部分 // 边长为baseNum正方形第row行的第一个数 ,边长为baseNum-2的第row-1行 ,边长为baseNum正方形的第row行的最后一个数 //print first number of the row System.out.format("%3s",4*baseNum-3-row+outNumber); //print middle part of the row by recursive print int nextBaseNum=baseNum-2; int nextRow=row-1; if(nextBaseNum>0&&nextRow>=0){ printN_M(nextBaseNum,nextRow,outNumber+4*baseNum-4); } //print last number of the row System.out.format("%3s",baseNum+row+outNumber); } public static void main(String[] args){ PrintSnakeNumberSquare.printN(3); PrintSnakeNumberSquare.printN(4); PrintSnakeNumberSquare.printN(5); PrintSnakeNumberSquare.printN(7); } }int baseNum=3 1 2 3 8 9 4 7 6 5 int baseNum=4 1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7 int baseNum=5 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9 int baseNum=7 1 2 3 4 5 6 7 24 25 26 27 28 29 8 23 40 41 42 43 30 9 22 39 48 49 44 31 10 21 38 47 46 45 32 11 20 37 36 35 34 33 12 19 18 17 16 15 14 13呃……打印时的格式是好的,不过MS粘不过来
|
|
返回顶楼 | |
发表时间:2009-12-11
最后修改:2009-12-11
def get(row,col,n) k=(if (2*row-n).abs<(2*col-n).abs then col else row end) k=n+1-k if (n+1)/2<k # 第几个圈 start = n*n-(n-2*k+2)*(n-2*k+2)+1 # 该圈的开始 step = n-2*k+1 # 该圈的边长 if row==k # 在上边 return start+ col - row elsif row==k+step # 在下边 return start+ 2*step + row - col elsif col==k # 在左边 return start + 4*step - (row - col) elsif col==k+step # 在右边 return start + 2*step - (col - row) end end 意犹未尽~~直接找出某点的数字的算法~~纯属数学逻辑了~~ ps : 自我感觉,用java来描述算法太蹩脚~~ |
|
返回顶楼 | |
发表时间:2009-12-11
嗯 二维数组 然后取模 然后拷贝 最简单的方法
可惜空间效率不高 |
|
返回顶楼 | |
发表时间:2009-12-11
这个题好像网易有道搜索面试的时候考过
|
|
返回顶楼 | |
发表时间:2009-12-11
这个是回旋矩阵,经典,大三时做过
|
|
返回顶楼 | |
发表时间:2009-12-11
数学题,高中参加奥赛时吴文虎老师的书里有。
|
|
返回顶楼 | |
发表时间:2009-12-11
mccxj 写道
n=8 x=[] (0...n).each do |i| x[i]=[] end # 初始化 def set(n,x,k) start = n*n-(n-2*k+2)*(n-2*k+2)+1 # 每个框框的开始值 step = n-2*k+1 # 每个框框的边长 (0..step).each do |i| # 上边 x[k-1][k+i-1]=start+i end (1..step).each do |i| # 右边 x[k+i-1][k+step-1]=start+step+i end (1..step).each do |i| # 下边 x[k+step-1][k+i-2]=start+3*step-i+1 end (1..step-1).each do |i| # 左边 x[k+i-1][k-1]=start+4*step-i end end (1..n).each do |i| set(n,x,i) end # 从外到里计算框框~~ (1..n).each do |i| p x[i-1].join(" ") end # 打印~~ ruby代码 简略草稿版~~
步骤:设置一个数据来保存,把数组看成一个个的正方形,计算每个正方形里边的值,并打印。。其他都是数学了。。 这题就ACM水平了?远着吧~~
|
|
返回顶楼 | |