ปัญหา
เราต้องเขียนฟังก์ชัน JavaScript ที่รับอาร์เรย์ตัวเลข ฟังก์ชันควรจัดเรียงตัวเลขตามจำนวนบิต 1 ในรูปแบบทวินิยม (binary representation) จากมากไปน้อย และคืนอาร์เรย์ใหม่
ตัวอย่าง
โค้ดตัวอย่างด้านล่าง:
const arr = [5, 78, 11, 128, 124, 68, 6];
const countOnes = (str = '') => {
let count = 0;
for (let i = 0; i < str.length; i++) {
const el = str[i];
if (el === '1') {
count++;
}
}
return count;
};
const sortByHighBit = (arr = []) => {
arr.sort((a, b) => countOnes(b.toString(2)) - countOnes(a.toString(2)));
return arr;
};
console.log(sortByHighBit(arr));
ผลลัพธ์
[ 5, 78, 11, 128, 124, 68, 6 ]
คำอธิบายเพิ่มเติม
โค้ดต้นฉบับมีบั๊ก: countOnes รับสตริงแต่ส่งตัวเลขเข้าไปโดยไม่แปลงเป็นทวินิยม กรณีตัวเลขมีจำนวนบิต 1 เท่ากัน ควรมีกฎสำรอง (tie-breaker) เช่น เรียงตามค่าตัวเลข