论坛首页 入门技术论坛

从一道面试题想到的

浏览 23815 次
该帖已经被评为新手帖
作者 正文
   发表时间:2009-12-30  
供参考
public class Calc {
	public static void main(String[] args){
		for(int i=1;i<8;i++){
			calc(i);
			System.out.println("---------------------------" +
					"---------------------------");
		}
	}
	
	public static void calc(int border){
		//setup border here
		int end = border;
		int start = 1;
		int seq = 1;
		int[] c;
		int[] n = {start, start};
		int[][] data = new int[end][end];
		data[0][0] = seq++;
		
		do{
			c = n;
			n = next(c, start, end);
			
			if(n[0] == start && n[1] == start){
				start++;
				end--;
				n[0] = start;
				n[1] = start;
				if(start == end){
					data[n[0]-1][n[1]-1] = seq++;
					break;
				}else if(start>end){
					break;
				}
			}
			
			data[n[0]-1][n[1]-1] = seq++;
		}while(true);
		
		for(int i=0;i<data.length;i++){
			for(int j=0;j<data[i].length;j++){
				System.out.print(data[j][i] + "\t");
			}
			System.out.print("\n");
		}
	}
	
	private static int[] next(int[] current, int start, int end){
		int x = current[0];
		int y = current[1];
		
		if(x == end && y != end){
			y++;
		}else if(x > start && y == end){
			x--;
		}else if(x == start && y > start){
			y--;
		}else if(x < end && y == start){
			x++;
		}else{
			x = start;
			y = end;
		}
		
		return new int[]{x, y};
	}
}
0 请登录后投票
   发表时间:2010-10-05  
个人觉得,如果一样东西拿来当花瓶,可以考虑面向对象的思路,可以考虑包装,可以考虑美化.
但如果像数据库里的select,每天都要进行不计其数的操作,这些东西可以抛开了. 最高效,最有效的办法,才是上策. 而最高效,往往和巧妙的算法相关.
虽然这个题,偏第一种--花瓶,但我不支持楼主对算法的一些褒贬.
藐予小子,仅抒己见.
0 请登录后投票
   发表时间:2010-10-05  
我猜这种题目,不会是用这个来考OO的吧。而只是看能否用简洁的代码把这件事情写对写出来。主要是逻辑思维和心算。
0 请登录后投票
   发表时间:2010-10-06  
看看同道的讨论 觉着很有意思 我也弄一个试试

思路很简单
把数据按照螺旋矩阵的路线装进数组
然后再打印出来


public class PrintSquare {
	private int[][] getArray(int n){
		if(n>0){
			int[][] array=new int[n][n];
			int x=0;
			int y=0;
			int xStart=0;
			int xEnd=n-1;
			int yStart=0;
			int yEnd=n-1;
			for(int i=1;i<=n*n;i++){
				array[y][x]=i;
				if(y==yStart&&x<xEnd){//横向前进
					x++;
					if(x==xEnd){
						yStart++;
					}
				}
				else if(y<yEnd&&x==xEnd){//纵向前进
					y++;
					if(y==yEnd){
						xEnd--;
					}
				}
				else if(y==yEnd&&x>xStart){//横向倒退
					x--;
					if(x==xStart){
						yEnd--;
					}
				}
				else if(y>yStart&&x==xStart){//纵向倒退
					y--;
					if(y==yStart){
						xStart++;
					}
				}
			}
			return array;
		}
		return null;
	}
	
	public void printSquare(int n){
		if(n>0){
			int[][] arr=getArray(n);
			for(int i=0;i<n;i++){
				for(int j=0;j<n;j++){
					System.out.print(arr[i][j]+"\t");
				}
				System.out.println();
			}
		}
	}
	
	public static void main(String[] args) {
		PrintSquare test=new PrintSquare();
		test.printSquare(5);
		System.out.println();
		test.printSquare(6);
	}

}

0 请登录后投票
论坛首页 入门技术版

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