在 JavaScript 中对角遍历矩阵
javascriptweb developmentfront end technology
问题:
我们需要编写一个 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 ]