Vấn đề:
Cần viết hàm JS nhận ma trận vuông (số hàng = số cột). Duyệt theo đường chéo và tạo mảng mới theo thứ tự duyệt.
Ví dụ:
const arr = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ];
Kết quả:
const output = [1, 2, 4, 7, 5, 3, 6, 8, 9];
Ví dụ
Mã thực hiện:
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));
Giải thích code:
Các bước:
Duyệt theo một hướng, theo dõi điểm bắt đầu.
Nếu chỉ số chẵn, đẩy vào stack và pop khi hết đường chéo, thêm vào mảng kết quả.
Tăng chỉ số khi chuyển đường chéo tiếp theo.
Tăng chỉ số cột bắt đầu đến cuối, sau đó tăng chỉ số hàng bắt đầu.
Kết quả
Kết quả in ra console:
[ 1, 2, 4, 7, 5, 3, 6, 8, 9 ]