ปัญหา:
เราจำเป็นต้องเขียนฟังก์ชัน 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 ]