正确
需要考虑多个点
如何进行处理,即处理时每行从第几个数开始,到第几个数结束,这里选择左闭右开
圈数问题,多圈数需要往进旋转,会产生边界待处理数字的增多,可自行画n=3,n=5时的情况,若不考虑此情况,致使后续圈一直在第一圈的位置进行覆盖
还需要考虑每一圈的起始位置,若不考虑,同上一问题,后续的值会对前面的值进行覆盖
class Solution {
public int[][] generateMatrix(int n) {
int a[][] = new int[n][n];
int i = 1; //填入数字的值
int broder = 1; //边界值,每一圈都左闭右开,代表了未处理的数字,每进一圈,边界待处理的数字多一
int loop = 1; //圈数
int startX=0; //每圈的起始位置,用于让圈往里转
int startY=0;
int x,y; //代表行列
while(loop <= n/2){
for ( y = startY; y < n - broder; y++) {
a[startX][y] = i;
i++;
}
for (x = startX; x < n - broder; x++) {
a[x][y] = i;
i++;
}
for (; y > startY; y--) {
a[x][y] = i;
i++;
}
for (; x > startX; x--) {
a[x][y] = i;
i++;
}
startX++;
startY++;
broder++;
loop++;
if(n % 2 == 1){
a[n/2][n/2]=i;
}
}
if(n % 2 == 1){
a[n/2][n/2]=i;
}
return a;
}
}
错误
循环条件出错,当圈数大于1时,后续圈的内容会覆盖在第一圈的位置,需更改循环条件,以达到后续不断向里的目的
未考虑边界待处理的值
class Solution {
public int[][] generateMatrix(int n) {
int a[][] = new int[n][n];
int i = 1;
int loop = 1;
while(loop <= n/2){
for (int x = 0, y = 0; y < n - 1; y++) {
a[x][y] = i;
i++;
}
for (int x = 0, y = n - 1; x < n - 1; x++) {
a[x][y] = i;
i++;
}
for (int x = n - 1, y = n - 1; y > 0; y--) {
a[x][y] = i;
i++;
}
for (int x = n - 1, y = 0; x > 0; x--) {
a[x][y] = i;
i++;
}
loop++;
if(n % 2 == 1){
a[n/2][n/2]=i;
}
}
if(n/2==0){
a[0][0] = 1;
}
return a;
}
}