论坛首页 招聘求职论坛

深圳一家公司面试问题,很囧

浏览 78567 次
精华帖 (0) :: 良好帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-12-10  
大一的时候做过,确实很麻烦。
0 请登录后投票
   发表时间: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();
		}
	}
}



牛人啊!我们大四了,前段时间有个面试指导的课,老师就是这种思想做的,但代码量比这多好几倍呢!
0 请登录后投票
   发表时间: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水平了?远着吧~~

 

0 请登录后投票
   发表时间: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粘不过来

 

0 请登录后投票
   发表时间: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来描述算法太蹩脚~~

0 请登录后投票
   发表时间:2009-12-11  
嗯 二维数组 然后取模 然后拷贝 最简单的方法
可惜空间效率不高
0 请登录后投票
   发表时间:2009-12-11  
这个题好像网易有道搜索面试的时候考过
0 请登录后投票
   发表时间:2009-12-11  
这个是回旋矩阵,经典,大三时做过
0 请登录后投票
   发表时间:2009-12-11  
数学题,高中参加奥赛时吴文虎老师的书里有。
0 请登录后投票
   发表时间: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水平了?远着吧~~

 


最讨厌这种到处显摆Ruby代码的

1 请登录后投票
论坛首页 招聘求职版

跳转论坛:
Global site tag (gtag.js) - Google Analytics