ST螺旋矩阵!
1、模拟转圈过程,需要处理较多边界条件。要遵循循环不变量的原则。不变量是对每条边的处理规则,每条边的左闭右开,还是左闭右闭要想好,坚持好一个规则来处理好每一条边。
var generateMatrix = function(n) {
let startX = startY = 0; // 起始位置,这是坐标位置(startX, startY)
let loop = Math.floor(n/2); // 旋转圈数,3X3旋转1圈,4x4旋转2圈。
let mid = Math.floor(n/2); // 中间位置,只有奇数才存在中间位置,后面会判断奇偶性,偶数就不用这一步
let offset = 1; // 控制每一层填充元素个数
let count = 1; // 更新填充数字,由于题中说是1到n^2^,所以第一个填充数字是1,下一个是2,这样往下排。
let res = new Array(n).fill(0).map(() => new Array(n).fill(0));
//Array(n)表示有n个元素的一维数组,fill(0)是令数组中的每个元素都为0,map是将一维数组()遍历成二维数组(矩阵nxn)的函数。
while (loop--) {
//loop--是先判断再减1;--loop是先减1后判断。
let row = startX, col = startY;//从第一个元素开始;
// 上行从左到右(左闭右开);对于上行来说,要对其列进行限制,由于上面已经说了col=startY所以下面直接用;就行了,不用在写一遍了。
for (; col < n - offset; col++) {
res[row][col] = count++;
}
// 右列从上到下(左闭右开)
for (; row < n - offset; row++) {
res[row][col] = count++;
}
// 下行从右到左(左闭右开)
for (; col > startY; col--) {
res[row][col] = count++;
}
// 左列做下到上(左闭右开)
for (; row > startX; row--) {
res[row][col] = count++;
}
//注意for循环和while循环的区别使用
// 更新起始位置
startX++;
startY++;
// 更新offset
offset += 1;
}
// 如果n为奇数的话,需要单独给矩阵最中间的位置赋值
if (n % 2 === 1) {
res[mid][mid] = count;
}
return res;
};

浙公网安备 33010602011771号