问题描述:
给你一个整数 n ,对于 0 <= i <= n 中的每个 i ,计算其二进制表示中 1 的个数 ,返回一个长度为 n + 1 的数组 ans 作为答案。
示例1:
输入:n = 2
输出:[0,1,1]
解释:
0 --> 0
1 --> 1
2 --> 10
示例2:
输入:n = 5
输出:[0,1,1,2,1,2]
解释:
0 --> 0
1 --> 1
2 --> 10
3 --> 11
4 --> 100
5 --> 101
解题思路:
方法一:JS中的toString()方法。
- 利用toString()方法将数字转为二进制的形式
- 计算每个二进制中1的数量
/**
- @param {number} n
- @return {number[]}
*/
var countBits = function(n) {
let res = []
for(let i = 0; i <= n; i++){
res.push((getOneNum(i.toString('2'))))
}
return res
};
// 计算num字符串中包含多少个1
function getOneNum(num){
let count = 0
for(let c of num){
if(c === '1'){
count++
}
}
return count
}
方法二:Brian Kernighan 算法
- Brian Kernighan 算法:用于清除二进制数中最右侧的1。做法:x = x & (x - 1)。例如x = 20, 二进制为10100,x-1的二进制为10011,则x & (x -1) = 10000,将x中最右侧的1清除掉了。
/**
* @param {number} n
* @return {number[]}
*/
var countBits = function(n) {
let res = []
for(let i = 0; i <= n; i++) {
res.push(getOneNum(i))
}
return res
};
function getOneNum(num){
let res = 0
while(num > 0){
num = num & (num - 1)
res += 1
}
return res
}