ปัญหา
เราจำเป็นต้องเขียนฟังก์ชัน JavaScript ที่ใช้จำนวนเต็มเดียว num เป็นอาร์กิวเมนต์แรกและอาร์กิวเมนต์เดียว ฟังก์ชันของเราควรเตรียมอาร์เรย์สำหรับตัวเลขทุกตัวตั้งแต่ 0 ถึง num (รวมทั้งทั้งคู่) สำหรับแต่ละตัวเลข องค์ประกอบที่เกี่ยวข้องควรเป็นตัวเลขของ 1s ที่มีอยู่ในการแสดงเลขฐานสองของตัวเลขนั้น
ตัวอย่างเช่น หากอินพุตของฟังก์ชันคือ −
const num = 4;
จากนั้นผลลัพธ์ควรเป็น −
const output = [0, 1, 1, 2, 1];
คำอธิบายผลลัพธ์:
เนื่องจาก 0 มี 0 1s ในรูปแบบไบนารี 1 มี 1 เป็นต้น
ตัวอย่าง
รหัสสำหรับสิ่งนี้จะเป็น −
const num = 4; const mapBinary = (num = 0) => { if (num === 0){ return [0]; }; const res = [0]; for (let i = 1; i <= num; i++) { const n = i % 2 === 0 ? res[i/2] : res[Math.floor(i/2)] + 1; res.push(n); }; return res; };
คำอธิบายโค้ด:
ขณะคำนวณบิต มีบางสิ่งที่เราควรระลึกไว้เสมอเพื่อให้ง่ายขึ้น
-
numberOfBits(n) ===numberOfBits(2*n) ผลลัพธ์ที่สองได้รับ 0 บิตเพิ่มอีก 1 บิตเมื่อเทียบกับผลลัพธ์แรก
-
ถ้า n เป็นเลขคู่ บิตสุดท้ายของ n จะเป็น 0
-
ถ้า n เป็นเลขคี่ การคำนวณผลลัพธ์ก็ถือว่าแทนที่บิตสุดท้ายของ (n-1)/2 ด้วย 1 ดังนั้นเราจึงได้สมการ numberOfBits(n) ===numberOfBits(Math.floor(n / 2)) +1 .
ผลลัพธ์
และผลลัพธ์ในคอนโซลจะเป็น −
[ 0, 1, 1, 2, 1 ]