思路:
(1)可以使用暴力破解法,对于每一个数,因为它的二进制位数是一定的,再遍历32次,统计1的次数,就可以统计出每一个整数的二进制中的1的次数了。
class Solution {
public:
int countOnes(int x) {
int ones = 0;
while (x > 0) {
x &= (x - 1);
ones++;
}
return ones;
}
vector<int> countBits(int n) {
vector<int> bits(n + 1);
for (int i = 0; i <= n; i++) {
bits[i] = countOnes(i);
}
return bits;
}
};
(2)如果一个正整数i是一个偶数,那么如果将它二进制数右移一位,就等于求得了它i/2。一个数i如果它是偶数,它的二进制数中1的次数等于i/2的二进制数中1的个数。如果数是奇数,那么它会多1。所以如果我们逐步从0开始,就能逐步得出结果了。这个方法也有点像经验法找规律。
vec[i] = vec[i >> 1] + (i & 1);
i >> 1等于就是求i/2,i&1就是求它是偶数还是奇数,这里很巧。
class Solution {
public:
vector<int> countBits(int n)
{
vector<int>vec(n+1,0);
for (int i = 1;i <= n;i++)
{
vec[i] = vec[i >> 1] + (i & 1);
}
return vec;
}
};