ปัญหา
เราจำเป็นต้องเขียนฟังก์ชัน JavaScript ที่รับอาร์เรย์สองอาร์เรย์ของตัวเลขหลักเดียวแทนตัวเลขสองตัว arr1 และ arr2 เป็นอาร์กิวเมนต์แรกและตัวที่สอง อาร์กิวเมนต์ที่สามของฟังก์ชันจะเป็นตัวเลข
num (num <= length of arr1 + length of arr2)
ฟังก์ชันของเราควรส่งคืนอาร์เรย์ใหม่ของตัวเลขหลักเดียวของความยาว num ซึ่งในตัวเองเป็นตัวแทนของตัวเลข และจำนวนควรเป็นจำนวนสูงสุดที่เราสามารถสร้างโดยใช้องค์ประกอบจากทั้งสองอาร์เรย์ เงื่อนไขเดียวสำหรับเราคือเราต้องรักษาลำดับสัมพัทธ์ขององค์ประกอบจากอาร์เรย์เดียวกัน
ตัวอย่างเช่น หากอินพุตของฟังก์ชันคือ −
const arr1 = [1, 3, 4, 5, 6]; const arr2 = [9, 1, 2, 5, 8, 3]; const num = 4;
จากนั้นผลลัพธ์ควรเป็น −
const output = [9, 8, 6, 3];
ตัวอย่าง
รหัสสำหรับสิ่งนี้จะเป็น −
const arr1 = [1, 3, 4, 5, 6]; const arr2 = [9, 1, 2, 5, 8, 3]; const num = 4; const maxArray = (arr1 = [], arr2 = [], num) => { const map = new Map(); const match = (a, b, num) => { if (map.has(a + ',' + b + ',' + num)) { return map.get(a + ',' + b + ',' + num); } let output = []; while(num > 0) { let maxa = -Infinity; let maxai = 0; let maxb = -Infinity; let maxbi = 0; for(let i = a; i < arr1.length && arr1.length + arr2.length - (i + b) >= num; i++) { if (arr1[i] > maxa) { maxa = arr1[i]; maxai = i; } } for(let i = b; i < arr2.length && arr1.length + arr2.length - (a + i) >= num; i++) { if (arr2[i] > maxb) { maxb = arr2[i]; maxbi = i; } } if (maxa === maxb) { output.push(maxa); let ca = map.get(a+','+(maxbi+1)+','+(num-1)) || match(a, maxbi+1, num-1); let cb = map.get((maxai+1)+','+b+','+(num-1)) || match(maxai+1,b,num-1); map.set(a+','+(maxbi+1)+','+(num-1), ca); map.set((maxai+1)+','+b+','+(num-1), cb); if (ca.join('') > cb.join('')) { return [...output, ...ca]; } else { return [...output, ...cb]; } } else if (maxa > maxb) { output.push(maxa); a = maxai + 1; } else { output.push(maxb); b = maxbi + 1; } num--; } map.set(a + ',' + b + ',' + num, output); return output; } return match(0, 0, num); }; console.log(maxArray(arr1, arr2, num));
คำอธิบายโค้ด:
ขั้นตอนที่เราทำคือ −
-
ใช้ for-loop จนกว่าจำนวนที่เหลือจะได้รับอนุญาต
-
หาก arr1 มีจำนวนมากกว่า arr2 เราจะใช้หมายเลข arr1 ก่อน มิฉะนั้น เราใช้ arr2number
-
เมื่อ arr1 และ arr2 มีตัวเลขเท่ากันจนกว่าจะอนุญาตให้ใช้ for-loop เราใช้การเรียกซ้ำเพื่อเปรียบเทียบค่าทั้งสองและเลือกจำนวนที่มากกว่า
ผลลัพธ์
และผลลัพธ์ในคอนโซลจะเป็น −
[ 9, 8, 6, 3 ]