题目的意思是:给定一个非负整数i,在范围0≤i≤num数中计算二进制表示的1的数量,并把他们作为一个数组返回。
class Solution {
public:
vector<int> countBits(int num) {
vector<int> ret(num+1,0);
int cnt=0;
int j=1;
int temp;
ret[0]=0;
for(int i=1;i<=num;++i){
cnt=0;
temp=i;
while(temp>0){
if(temp%2==1) cnt++;
temp=temp>>1;
}
ret[j]=cnt;
++j;
}
return ret;
}
};
总算自己码出了代码,虽然和各位大神的代码还有点距离,但是自己还是很开心,继续加油!说下我的思路,我是直接按照题目的要求,算每一个数的二进制表示中的1的数量。
关键语句:
while(temp>0)
{
if(temp%2==1) cnt++;
temp=temp>>1;
}
“temp%2==1”就是求二进制表示数的最后一位,如果等于1,cnt++。然后“temp=temp>>1;”表示让这个二进制数右移一位,最高位用0补齐,直到temp=0,这样就求得了一个数二进制表示中1的数量。
下面看看大神们的代码:
主要是观察到
1
10
11
100
101
110
111
1000
上述观察到1->10/11 10->100/101 11->110/111
即循环地在每个数后面加0、1可得接下来的数字。因此第i位就是第i/2位+(i%2)的值。以下为我的代码:
class Solution {
public:
vector<int> countBits(int num) {
vector<int>vec(num+1,0);
vec[0]=0;
for(int i = 1; i <= num; i++){
vec[i]=vec[i/2]+(i % 2);
}
return vec;
}
};
思路一样,就是算的过程不一样的代码:
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&(i-1)] + 1;
return ret;
}
};