题目
思路
考点就是统计1的个数,直接想到的就是n&(n-1),需要遍历所有的数字进行统计,复杂度较高。
在看了别人的做法以后,改了版本2。
规律为:
1.首先考虑数字表示所需的二进制位数,每两个数所需位数相同,比如0和1需要1位,2和3需要2位……每一对数包含一个奇数一个偶数,奇数中包含的1的个数比偶数多1。
2.对于偶数和它右移1位的数字包含1的个数相同。
公式:ret[i] = ret[i>>1] + i%2;
代码
1.n&(n-1)版本
class Solution {
public:
vector<int> countBits(int num) {
vector<int> ret;
for(int i=0;i<=num;i++)
{
int count=0;
int bitNum = i;
while(bitNum)
{
bitNum = bitNum&(bitNum-1);
count++;
}
ret.push_back(count);
}
return ret;
}
};
2.记录信息用于后续统计。
class Solution {
public:
vector<int> countBits(int num) {
vector<int> ret(num+1, 0);
for(int i=1; i<=num; ++i)
ret[i] = ret[i>>1] + i%2;
return ret;
}
};