解法:描述从外圈到内圈上、右、下、左行遍历幅值的过程。
注意规则:行和列遍历时注意制定遍历区间的规则,如n*n矩阵,第一圈第上、右。下、左行、遍历规则为[0,n-1]。
java代码
public static int[][] generateMatrix(int n){
int[][] arr = new int[n][n];
int startX = 0, startY = 0; //每列起始位置.行起始位置
int rule = 1;//左闭右开
int count = 1; //矩阵数字
int loop =1; //圈数
int i,j;//行、列
while (loop <= n/2){
//上行
for (j=startY; j <n-rule ; j++) {
arr[startX][j]=count++;
}
//i=0,j=1
//右行
for (i=startX; i <n-rule; i++) {
arr[i][j]=count++;
}
//i=1,j=2
//下行
for (; j > startY ; j--) {
arr[i][j]=count++;
}
//i=2,j=0
//左行
for (; i >startX; i--) {
arr[i][j]=count++;
}
//i=1,j=0;
startX++;
startY++;
rule++;
loop++;
}
if(n%2==1){ //奇数时多出的数据
arr[n/2][n/2]=n*n;
}
return arr;
}
测试奇数
@Test
public void test5(){
int n =3;
System.out.println(Arrays.deepToString(generateMatrix(n)));
}
结果
[[1, 2, 3], [8, 9, 4], [7, 6, 5]]
测试偶数
@Test
public void test4(){
int n =4;
System.out.println(Arrays.deepToString(generateMatrix(n)));
}
结果
[[1, 2, 3, 4], [12, 13, 14, 5], [11, 16, 15, 6], [10, 9, 8, 7]]