Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Javascript

การคำนวณ 1 วินาทีในการแทนค่าเลขฐานสองของตัวเลขใน JavaScript


ปัญหา

เราจำเป็นต้องเขียนฟังก์ชัน 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 ]