[一亩三分地] Spirally Shift 2D array 二维数组顺时针右移一位 | 书脊
这题看着挺简单, 各种corn case唉. 如果不是仔细写, 会被面试官直接按到死.
这题看着挺简单, 各种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
输出:
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 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
第一次写的时候, 把tmp放到外边了, 结果上面的case2跑错, 提醒后放到里面, 就好了.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;
}
Read full article from [一亩三分地] Spirally Shift 2D array 二维数组顺时针右移一位 | 书脊