题目:LeeCode338. 比特位计数
给你一个整数,对于 中的每个 ,计算其二进制表示中 的个数 ,返回一个长度为 的数组 作为答案。
思路
这道题本质上考察如何求一个数的二进制表示中1的个数。
我们可以分奇偶讨论。
若为偶数,则它的二进制形式中1的个数和相同。比如的二进制表示为:。的二进制表示为。这是因为乘本质上是二进制左移一位,低位补,所以的数量保持不变。
若为奇数,那么必定为偶数,而偶数的二进制最低位一定是。所以偶数后最低位会变成且不会进位。例如其实就是。
基于上述分析,我们可以得到状态转移方程:
所以代码为:
public int[] countBits(int n) {
int[] res = new int[n+1];
for(int i = 0;i<=n;i++){
if(i%2==0){
res[i]=res[i/2];
}else{
res[i]=res[i/2]+1;
}
}
return res;
}