题目
给定一个非负整数 n ,请计算 0 到 n 之间的每个数字的二进制表示中 1 的个数,并输出一个数组。
代码实现
位运算
public int[] countBits(int n) {
int[] res = new int[n+1];
for (int i = 0; i <= n; i++) {
for (int j = 31; j >= 0; j--) {
if((i>>j & 1) != 0){
res[i]++;
}
}
}
return res;
}
动态规划
时间效率更高
public int[] countBits(int n) {
int[] res = new int[n+1];
res[0] = 0;
for (int i = 1; i <= n; i++) {
res[i] = res[i/2] + (i & 1);
}
return res;
}