题目介绍
力扣338题:leetcode-cn.com/problems/co…
分析
对于所有的数字,只有两类:
-
奇数:二进制表示中,奇数一定比前面那个偶数多一个 1,因为多的就是最低位的 1。
举例:
0 = 0 ,1 = 1 , 2 = 10,3 = 11
-
偶数:二进制表示中,偶数中 1 的个数一定和除以 2 之后的那个数一样多。因为最低位是 0,除以 2 就是右移一位,也就是把那个 0 抹掉而已,所以 1 的个数是不变的。
举例:
2 = 10,4 = 100,6 = 110,8 = 1000
另外,0 的 1 个数为 0,于是就可以根据奇偶性开始遍历计算了。
代码如下:
class Solution {
public int[] countBits(int num) {
int[] result = new int[num + 1];
for(int i = 1; i <= num; i++){
if ((i & 1) == 0){
//偶数二进制1的个数跟右移一位1的个数一样
result[i] = result[i >> 1];
}else {
//奇数二进制1的个数等于偶数二进制1的个数 + 1
result[i] = result[i - 1] + 1;
}
}
return result;
}
}