这里关于旋转数组问题1&2,解题思路都是一样的。这里以2问题为例说明。
旋转数组2问题
输入:一个整数n
输出:按照逆时针从外向内的二维数组
用例:3===>
[ [1,2,3],
[8,9,4],
[7,6,5] ]
分析
关键是看一下这个数组的形式。直观上来看就是按照逆时针一个个生成的,所以解题思路也应该是按照这个。关键是看用什么方式来控制这个逆时针的顺序。
思路
按照一圈逆时针来做一个循环,这里用x和y来指出当前操作元素的范围。n表示当前数组的大小,每执行完一个循环,n-2,直到n=0或者n=1为止。
代码
package day_17;
public class Spiral_Mat_2 {
public int[][] generateMatrix(int n) {
// 按照先处理最外层,再迭代处理的思想来做
int res[][]= new int[n][n];
int x=0,y=0,val=1; // xy记录当前位置
while(n>0){
if(n==1){
res[x][y]=val;
break;
}
for(int i=0;i<n-1;i++){ //首行
res[x][y++]=val; // 这里的位置自动就加上去了
// 注意上面的 循环条件是 i<n-1,然后 y++,用完后y自动++。
val++;
}
for(int i=0;i<n-1;i++){ //末列
res[x++][y]=val;
val++;
}
for(int i=0;i<n-1;i++){
res[x][y--]=val;
val++;
}
for(int i=0;i<n-1;i++){
res[x--][y]=val;
val++;
} // 这个时候 x=0;y=0 所以需要下面再++
x++;
y++;
n=n-2;
}
return res;
}
public static void main(String args[]){
Spiral_Mat_2 s = new Spiral_Mat_2();
int arr[][] = s.generateMatrix(3);
for(int i=0;i<arr.length;i++){
for (int j=0;j<arr[0].length;j++){
System.out.print(arr[i][j]);}
}
}
}