ปัญหา
สมมติว่ามีคนยืนต่อคิวอยู่ n คน เราต้องการแจกกล้วยให้ประชาชนดังนี้ −
-
เราให้กล้วย 1 ลูกแก่คนแรก กล้วย 2 ลูกกับคนที่สอง และต่อไปเรื่อย ๆ จนกว่าเราจะแจกกล้วยให้คนสุดท้าย n ลูก
-
จากนั้นเรากลับไปที่จุดเริ่มต้นของแถวโดยให้กล้วย n + 1 อันแก่คนแรก n + 2 กล้วยกับคนที่สอง เป็นต้น จนกว่าเราจะให้กล้วย 2 * n กับคนสุดท้าย
-
กระบวนการนี้เกิดขึ้นซ้ำๆ (โดยที่เราให้กล้วยเพิ่มหนึ่งครั้งในแต่ละครั้ง และย้ายไปที่จุดเริ่มต้นของแถวหลังจากที่เราไปถึงจุดสิ้นสุด) จนกว่าขนมจะหมด คนสุดท้ายจะได้รับกล้วยที่เหลือทั้งหมดของเรา
เราจำเป็นต้องเขียนฟังก์ชัน JavaScript ที่ใช้จำนวนคน num เป็นอาร์กิวเมนต์แรก และจำนวนกล้วย m เป็นอาร์กิวเมนต์ที่สอง
ฟังก์ชันของเราควรส่งคืนอาร์เรย์ (ของความยาว num sum m) ที่แสดงถึงการกระจายตัวสุดท้ายของกล้วย
ตัวอย่างเช่น หากอินพุตของฟังก์ชันคือ −
const num = 3; const m = 10;
จากนั้นผลลัพธ์ควรเป็น −
const output = [5, 2, 3];
คำอธิบายผลลัพธ์:
ในเทิร์นแรก res[0] +=1 และอาร์เรย์คือ [1,0,0]
ในเทิร์นที่สอง res[1] +=2 และอาร์เรย์คือ [1,2,0]
ในเทิร์นที่สาม res[2] +=3 และอาร์เรย์คือ [1,2,3]
ในเทิร์นที่สี่ 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]