使用 JavaScript 对矩阵进行对角遍历


问题

我们需要编写一个 JavaScript 函数,该函数接收一个方阵(一个包含相同行和列数的数组数组)。该函数应斜向遍历该数组数组,并准备一个新数组,其中包含以遍历时遇到的顺序放置的元素。

例如,如果输入函数的是 -

const arr = [
   [1, 2, 3],
   [4, 5, 6],
   [7, 8, 9]
];

那么输出应该是 -

const output = [1, 2, 4, 7, 5, 3, 6, 8, 9];

示例

 动态演示

代码如下 -

const arr = [
   [1, 2, 3],
   [4, 5, 6],
   [7, 8, 9]
];
const findDiagonalOrder = (arr = []) => {
   if(!arr.length){
      return [];
   };
   let ind = 0;
   let colBegin = 0, rowBegin = 0;
   let rowMax = arr.length, colMax = arr[0].length;
   const res = [], stack = [];
   while(rowBegin< rowMax || colBegin<colMax) {
      for(let row = rowBegin, col = colBegin; row < rowMax && col >=0 ;
      row++,col--){
         if(ind%2 === 0){
            stack.push((arr[row][col]));
         }else{
            res.push(arr[row][col]);
         };
      };
      ind++;
      while(stack.length){
         res.push(stack.pop());
      };
      colBegin++
      if(colBegin> colMax-1 && rowBegin < rowMax){
         colBegin = colMax-1
         rowBegin++
      }
   };
   return res
};
console.log(findDiagonalOrder(arr));

代码说明

我们采取的步骤如下 -

  • 按一个方向遍历,同时跟踪起点。

  • 如果索引为偶数,我们将推入堆栈,并在到达对角线末端时弹出,将弹出的内容添加到我们的输出数组。

  • 我们随着移动到下一个对角线而不断增加索引。

  • 我们不断增加列开始索引,直到它到达末端,因为在接下来的迭代中它将停止在最后一个索引,而我们将从该点开始增加行开始索引。

输出

控制台中的输出如下 -

[
   1, 2, 4, 7, 5,
   3, 6, 8, 9
]

更新时间: 04-Mar-2021

723 次浏览

开启你的 职业生涯

通过完成本课程颁发证书

开始
广告