题目大意:计算数字的二进制中'1'的个数。
思路:计算'1'的个数是常见的题目了,什么 x&x-1 把最右边的1变成0 ,什么 y | y+1把最右边的0变成1之类的,常见不鲜。
根据题后面的hints,计算较大的数时可以利用前面的计算结果,把同余数位置上已经得到的结果+1就行,比如计算7的结果,只要用3的结果+1即可。carry的值要根据计算到的值,每到2的幂就左移1位。
AC code:
class Solution {
public:
vector<int> countBits(int num) {
vector<int> res(num + 1);
for (int i = 1, carry = 0; i <= num; ++i) {
if (i & i - 1) {
res[i] = res[i - carry] + 1;
} else {
res[i] = 1;
if(carry > 0)
carry <<= 1;
else ++carry;
}
}
return res;
}
};