最近在看面试宝典,其中看到一个题目说:输入一个正整数n,输出它的zigzag数组。
分析:书上给出了数学方面的思考然后给了代码。但是我感觉如果真是面试或者考试遇到的话,我这种笨脑袋肯定是想不出来的,因此最好的方式是观察数组,然后找到规律。观察可知,数字递增的方向只有4个:right, left-down, down, right-up。因此我们可以设置一个switch语句,然后每走一步,判断下步要走的方向。因为输出的是n*n的数组,因此矩阵的右下角的数字肯定不会超过n*n,用它作为结束条件即可。
(需要注意的是:刚开始做时忘记考虑矩阵赋值了一半时,右下角的怎么赋值。因此每个方向走完了,下一步都会有两种方向。不要忘记右下角的赋值。)
代码如下:
public class Test { static int[][] zigzag(int n) { int[][] a = new int[100][100]; int right = 0, left_down = 1, down = 2, right_up = 3; int s = 0; int it = n * n; int flag = 0; int i = 0, j = 0; while(s <= it) { a[i][j] = s; switch (flag){ case 0: { //right j++; if(0 == i) flag = 1; else if(n-1 == i) flag = 3; break; } case 1: {//left-down i++; j--; if(j == 0) flag = 2; else if(i == n-1) flag = 0; break; } case 2: {//down i++; if(0 == j) flag = 3; else if(n-1 == j) flag = 1; break; } case 3: { i--; j++; if(0 == i) flag = 0; else if(n-1 == j) flag = 2; break; } } s++; } return a; } public static void main(String[] args) { // TODO Auto-generated method stub int n = 7; int[][]a = zigzag(n); for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { System.out.print(a[i][j] + " "); } System.out.println(); } } }