Zigzag数组 -- 面试宝典

最近在看面试宝典,其中看到一个题目说:输入一个正整数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();
        }

    }

}

 

你可能感兴趣的:(Zigzag数组 -- 面试宝典)