[一亩三分地] 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跑错, 提醒后放到里面, 就好了.
Leave A Comment