ปัญหา
พิจารณาสถานการณ์ต่อไปนี้:
มีหลอดไฟ n ดวงที่ปิดอยู่ทั้งหมด เราเปิดหลอดไฟทั้งหมดก่อน จากนั้นปิดหลอดไฟทุก 2 ดวง รอบที่ 3 เราสลับสถานะหลอดไฟทุก 3 ดวง (เปิดถ้าปิด ปิดถ้าเปิด)
โดยทั่วไป สำหรับรอบที่ i เราจะสลับหลอดไฟทุก i ดวง และรอบสุดท้ายที่ n เราจะสลับแค่หลอดสุดท้าย
เราต้องเขียนฟังก์ชัน JavaScript ที่รับ n เป็นอินพุตเพียงอย่างเดียว และหาว่าหลังจาก n รอบ จะมีหลอดไฟเปิดอยู่กี่ดวง
ตัวอย่างเช่น หากอินพุตคือ
const n = 4;
ผลลัพธ์ควรเป็น
const output = 2;
คำอธิบายผลลัพธ์:
ในอาร์เรย์สถานะ 0 แทนปิด 1 แทนเปิด
| รอบ | สถานะ |
|---|---|
| 1 | [1, 1, 1, 1, 1] |
| 2 | [1, 0, 1, 0, 1] |
| 3 | [1, 0, 0, 0, 1] |
| 4 | [1, 0, 0, 1, 1] |
| 5 | [1, 0, 0, 1, 0] |
ดังนั้นหลังจากรอบที่ 5 จะมีหลอดไฟเปิดอยู่ 2 ดวง
ตัวอย่างโค้ด
const n = 5;
const findOn = (n = 1) => {
let off = 0;
let on = n;
while(off <= on){
let mid = Math.floor((off + on) / 2);
if(mid * mid > n){
on = mid - 1;
}else{
off = mid + 1;
}
}
return Math.floor(on);
};
console.log(findOn(n));ผลลัพธ์
ผลลัพธ์ในคอนโซลจะเป็น
2