如何在JavaScript中生成指定大小的螺旋矩阵?技术实现求助
完善螺旋正方形矩阵的生成逻辑
嘿,你已经搭好了生成空矩阵的基础框架,现在只需要把螺旋填充的核心逻辑补全就大功告成啦!当前代码仅完成了第一行的填充,接下来我们用边界追踪法来实现完整的螺旋填充逻辑,这是实现这类需求最直观高效的方式之一。
核心实现思路
我们通过四个边界变量来锁定当前需要填充的矩阵区域:
top:当前待填充区域的顶部行索引bottom:当前待填充区域的底部行索引left:当前待填充区域的左列索引right:当前待填充区域的右列索引
然后按照顺时针方向循环执行填充操作,每完成一个方向的填充就收缩对应的边界,直到所有数字(从1到A²)都被填入矩阵:
- 从左到右填充
top行,填充完成后将top向下移动一行 - 从上到下填充
right列,填充完成后将right向左移动一列 - 若
top未超过bottom,从右到左填充bottom行,填充完成后将bottom向上移动一行 - 若
left未超过right,从下到上填充left列,填充完成后将left向右移动一列
完善后的完整代码
let generateMatrix = function(A) { // 创建A×A的全0二维矩阵,简化写法 let arr = Array.from({ length: A }, () => new Array(A).fill(0)); let counter = 1; let top = 0, bottom = A - 1; let left = 0, right = A - 1; // 循环填充直到所有数字都填入 while (counter <= A * A) { // 1. 填充顶部行:左→右 for (let i = left; i <= right; i++) { arr[top][i] = counter++; } top++; // 顶部边界下移 // 2. 填充右侧列:上→下 for (let i = top; i <= bottom; i++) { arr[i][right] = counter++; } right--; // 右侧边界左移 // 3. 填充底部行:右→左(需判断避免重复填充) if (top <= bottom) { for (let i = right; i >= left; i--) { arr[bottom][i] = counter++; } bottom--; // 底部边界上移 } // 4. 填充左侧列:下→上(需判断避免重复填充) if (left <= right) { for (let i = bottom; i >= top; i--) { arr[i][left] = counter++; } left++; // 左侧边界右移 } } return arr; } // 测试示例 console.log(generateMatrix(3)); // 输出 [[1,2,3],[8,9,4],[7,6,5]] console.log(generateMatrix(4)); // 输出 [[1,2,3,4],[12,13,14,5],[11,16,15,6],[10,9,8,7]]
关键细节说明
- 用
Array.from简化了空矩阵的创建,比嵌套循环更简洁易读 - 加入
top <= bottom和left <= right的判断,是为了避免矩阵边长为奇数时,最后一步重复填充中心元素 - 每完成一个方向的填充就收缩对应边界,确保每次填充的都是当前未被填充的区域
这样修改后,就能完美生成符合要求的螺旋顺序正方形矩阵了!
内容的提问来源于stack exchange,提问作者user12130378
相关产品推荐
相关产品推荐

