方法一:
红色的点为每一圈的起始点
var generateMatrix = function(n) {
let x = y = 0; // 起始位置
let loop = Math.floor(n/2); // 旋转圈数
let mid = Math.floor(n/2); // 中间位置
let number = 1; // 控制每一层填充元素个数
let count = 1; // 更新填充数字
let res = new Array(n).fill(0).map(() => new Array(n).fill(0));
while(loop--){
let row=y
let col=x
//左到右,col++
for(;col<n+x-number;col++){
res[row][col]=count++
}//for结束时,col为最大值
//上到下,row++
for(;row<n+y-number;row++){
res[row][col]=count++
}//for结束时,row为最大值
//从右到左,col--
for(col;col>x;col--){
res[row][col]=count++
}//for结束时,col为最小值
//从下到上,row--
for(row;row>y;row--){
res[row][col]=count++
}//for结束时,row为最小值
//更新起点
x++
y++
//更新控制每圈填的个数
number+=2
}
//如果n为奇数,最后一圈不成环,只有一个数
if(n%2===1){
res[mid][mid]=count
}
return res
};
方法二:
var generateMatrix = function(n) {
let count=1
let arr = new Array(n).fill(0).map(() => new Array(n).fill(0))
let top=0
let left=0
let right=bottom=n-1
while(left<=right&&top<=bottom){
for(let col=left;col<=right;col++){
arr[top][col]=count++
}
for(let row=top+1;row<=bottom;row++){
arr[row][right]=count++
}
if(left<right&&top<bottom){
for(let col=right-1;col>left;col--){
arr[bottom][col]=count++
}
for(let row=bottom;row>top;row--){
arr[row][left]=count++
}
}
top++
left++
right--
bottom--
}
return arr
};