二进制中1的个数
给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。
解法一:两重循环直接计算
public int[] countBits(int num) {
int[] ans = new int[num+1];
if(num == 0) ans[0] = 0;
for(int i = 1; i <= num; i++){
int size = 0;
int temp = i;
while(temp > 0){
if(temp%2 == 1){
size++;
}
temp /= 2;
}
ans[i] = size;
}
return ans;
}
时间复杂度:O(k*num);
空间复杂度:O(1),除了返回的数组以外,空间复杂度为常数。
解法二:动态规划,最低有效位
public int[] countBits(int num) {
int[] bits = new int[num+1];
for(int i = 1; i <= num; i++){
bits[i] = bits[i >> 1] + (i&1);
}
return bits;
}