[一亩三分地] Spirally Shift 2D array 二维数组顺时针右移一位

这题看着挺简单, 各种corn case唉. 如果不是仔细写, 会被面试官直接按到死.
先举几个栗子:

输入:
1 2 3
4 5 6
7 8 9
输出:
4 1 2
7 5 3
8 9 6

输入:
1 2 3 4 5
6 7 8 9 10
输出:
6 1 2 3 4
7 8 9 10 5

输入:
1 2
3 4
5 6
输出:
3 1
5 2
6 4

代码:

 public static int[][] shift(int[][] matrix) {
        int x = 0; //x指针
        int y = 0; //y指针
        int m = matrix.length;
        int n = matrix[0].length;

        while(m > 0 && n > 0) {
            int tmp = matrix[x+1][y]; //第一个元素[0][0] 要与[1][0]交换, 所以[x][y] 要与[x+1][y]交换
            if(m==1 || n == 1) //最里面的那层不交换
                break;
            for(int i = 0 ; i < n - 1; i++) {   //i从左往右扫到倒数第二个元素
                int t = tmp;
                tmp = matrix[x][y];
                matrix[x][y] = t;
                y++;
            }
            for(int i = 0 ; i < m - 1; i++) { //i从上往下扫, 扫到倒数第二个元素
                int t = tmp;
                tmp = matrix[x][y];
                matrix[x][y] = t;
                x++;
            }
            for(int i = 0 ; i < n - 1; i++) { //同上类推
                int t = tmp;
                tmp = matrix[x][y];
                matrix[x][y] = t;
                y--;
            }
            for(int i = 0 ; i < m - 1; i++) { //同上类推
                int t = tmp;
                tmp = matrix[x][y];
                matrix[x][y] = t;
                x--;
            }
            x++; //扫完外圈后, 把指针挪到内圈
            y++;
            m-=2; //内圈的列数
            n-=2; //内圈的行数
        }
        return matrix;
    }

 

第一次写的时候, 把tmp放到外边了, 结果上面的case2跑错, 提醒后放到里面, 就好了.