复杂的螺旋矩阵

时间:2019-09-10 09:06:00

标签: javascript algorithm

我正在接受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;
}

1 个答案:

答案 0 :(得分:1)

实现如下:

  • results是一个包含n个数组的数组(将在 while 循环中填充)。

  • counter计算访问的矩阵单元的数量。

  • startColumnendColumnstartRowendRow定义访问矩阵单元时逐渐缩小的矩形的边界。例如,当第一行被完全访问时,startRow会增加,因此第一行不再成为矩形的一部分。

  • while条件意味着矩形边界不必满足。在相反的情况下,矩形的表面将为0,因此矩阵将只访问过单元格,因此将终止。

  • 第一个for循环的意思是“擦除矩形的 top 边框;每次访问新的单元格时,将counter分配为该单元格的值并递增它”。

  • 第二,第三和第四循环的含义相同,但对于底部边界。