笔试题3. LeetCode OJ (3) Counting Bits

这里写图片描述
题目的意思是:给定一个非负整数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;  
    }  
};  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值