目录
题目:
示例:
分析:
题目给我们一个整数n,要我们返回一个长度为n+1的数组,数组的第 i 位元素是 整数 i 的二进制数拥有的1的数目。例如 10 的二进制是 1010,所以10拥有的1的数目是2。
那么我们直接从0遍历到n+1,再单独算出这个数拥有的1的数目就可以了。
第一种方法就是C++有内置一个函数,直接统计你这个数的二进制有多少个1,直接使用这个函数就可以得出来:
cpp
__builtin_popcount(i)
第二种方法就是我们直接手算。我们可以从一个数的二进制的右边第一位开始统计1的数目。如果一个数余2等于1,那么它的右边第一位就是1。
所以我们可以反复对这个数余2再除2,直到这个数变成了0,那么我们也就统计出了1的数目。
代码:
cpp
class Solution {
public:
//手动计算每个数的二进制有多少1
vector<int> countBits(int n) {
vector<int>res(n+1,0);
int temp=0;
for(int i=0;i<=n;i++){
temp=i;
while(temp){
//可以写成 res[i]+=temp&0x1;temp>>=1;
res[i]+=temp%2;
temp/=2;
}
}
return res;
}
//使用内置函数
vector<int> countBits(int n) {
vector<int>res(n+1,0);
for(int i=0;i<=n;i++){
res[i]=__builtin_popcount(i);
}
return res;
}
};