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;
};
posted @ 2026-01-13 20:52  琬六岁  阅读(1)  评论(0)    收藏  举报