Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Javascript

ข้ามแนวทแยงในเมทริกซ์ใน 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
]