我正在接受Google采访的培训,我试图了解我观看的视频中提出的解决方案。如果有人能解释一下这里发生的事情,我将不胜感激。
这是问题: 编写一个接受整数N并返回NxN螺旋矩阵的函数。
示例:
matrix(2)
[
[1, 2],
[4, 3]
]
matrix(3)
[
[1, 2, 3],
[8, 9, 4],
[7, 6, 5]
]
matrix(4)
[
[1, 2, 3, 4],
[12, 13, 14, 5],
[11, 16, 15, 6],
[10, 9, 8, 7]
]
代码:
function matrix(n) {
const results = [];
for (let i = 0; i < n; i++) {
results.push([]);
}
let counter = 1;
let startColumn = 0;
let endColumn = n - 1;
let startRow = 0;
let endRow = n - 1;
while (startColumn <= endColumn && startRow <= endRow) {
// Top row
for (let i = startColumn; i <= endColumn; i++) {
results[startRow][i] = counter;
counter++;
}
startRow++;
// Right column
for (let i = startRow; i <= endRow; i++) {
results[i][endColumn] = counter;
counter++;
}
endColumn--;
// Bottom row
for (let i = endColumn; i >= startColumn; i--) {
results[endRow][i] = counter;
counter++;
}
endRow--;
// start column
for (let i = endRow; i >= startRow; i--) {
results[i][startColumn] = counter;
counter++;
}
startColumn++;
}
return results;
}
答案 0 :(得分:1)
实现如下:
results
是一个包含n个数组的数组(将在 while 循环中填充)。
counter
计算访问的矩阵单元的数量。
startColumn
,endColumn
,startRow
,endRow
定义访问矩阵单元时逐渐缩小的矩形的边界。例如,当第一行被完全访问时,startRow
会增加,因此第一行不再成为矩形的一部分。
while
条件意味着矩形边界不必满足。在相反的情况下,矩形的表面将为0,因此矩阵将只访问过单元格,因此将终止。
第一个for
循环的意思是“擦除矩形的 top 边框;每次访问新的单元格时,将counter
分配为该单元格的值并递增它”。
第二,第三和第四循环的含义相同,但对于右,底部和左边界。