Computer >> Máy Tính >  >> Lập trình >> Javascript

Di chuyển theo đường chéo trong ma trận trong JavaScript

Vấn đề:

Chúng tôi được yêu cầu viết một hàm JavaScript nhận trong một ma trận vuông (một mảng các mảng có cùng số hàng và số cột). Hàm phải đi theo đường chéo qua mảng mảng đó và chuẩn bị một mảng mới gồm các phần tử được đặt theo thứ tự mà nó gặp phải khi đi ngang.

Ví dụ:nếu đầu vào của hàm là -

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

Sau đó, đầu ra phải là -

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

Ví dụ

Mã cho điều này sẽ là -

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 mã:

Các bước chúng tôi đã thực hiện là -

  • Đi ngang theo một hướng theo dõi điểm xuất phát.

  • Nếu chỉ mục là số chẵn, chúng tôi sẽ đẩy đến một ngăn xếp và bật lên khi nó đến cuối đường chéo, thêm ô vào mảng đầu ra của chúng tôi.

  • Chúng tôi tiếp tục tăng chỉ số khi chúng tôi chuyển sang đường chéo tiếp theo.

  • Chúng tôi tăng chỉ mục bắt đầu cột cho đến khi nó kết thúc, vì nó cho các lần lặp tiếp theo, nó sẽ bị dừng lại ở chỉ mục cuối cùng và chúng tôi sẽ tăng chỉ mục bắt đầu hàng di chuyển từ thời điểm này.

Đầu ra

Và đầu ra trong bảng điều khiển sẽ là -

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