ปัญหา
สมมติว่ามีคน n คนยืนคิว เราต้องการแจกกล้วยให้ตามวิธีดังนี้:
ให้ 1 กล้วยกับคนแรก 2 กล้วยกับคนที่สอง และต่อไปจนให้ n กล้วยกับคนสุดท้าย
จากนั้นกลับไปที่จุดเริ่มต้น ให้ n+1 กล้วยกับคนแรก n+2 กับคนที่สอง จนให้ 2*n กล้วยกับคนสุดท้าย
กระบวนการนี้ทำซ้ำ (ให้กล้วยเพิ่มทีละ 1 และกลับไปจุดเริ่มทุกครั้งที่ถึงปลาย) จนกว่าจะหมดกล้วย คนสุดท้ายจะได้กล้วยที่เหลือทั้งหมด
เราต้องเขียนฟังก์ชัน JavaScript ที่รับจำนวนคน num เป็นอาร์กิวเมนต์แรก และจำนวนกล้วย m เป็นอาร์กิวเมนต์ที่สอง
ฟังก์ชันควรคืนอาร์เรย์ (ความยาว num ผลรวม m) ที่แทนการแจกกล้วยสุดท้าย
ตัวอย่างเช่น หากอินพุตคือ
const num = 3; const m = 10;
ผลลัพธ์ควรเป็น
const output = [5, 2, 3];
คำอธิบายผลลัพธ์:
รอบที่ 1: res[0] += 1, อาร์เรย์เป็น [1,0,0]
รอบที่ 2: res[1] += 2, อาร์เรย์เป็น [1,2,0]
รอบที่ 3: res[2] += 3, อาร์เรย์เป็น [1,2,3]
รอบที่ 4: res[0] += 4, อาร์เรย์สุดท้ายเป็น [5,2,3]
ตัวอย่างโค้ด
const num = 3;
const m = 10;
const distributeBananas = (num = 1, m = 1) => {
const res = new Array(num).fill(0);
let curr = 1;
while(true){
for(let i = 0; i < num; i++){
if(m < curr){
res[i] += m;
return res;
}
res[i] += curr;
m -= curr;
curr++;
}
}
};
console.log(distributeBananas(num, m));ผลลัพธ์
ผลลัพธ์ในคอนโซลจะเป็น
[5, 2, 3]