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

来源:互联网 发布:c语言调用函数什么意思 编辑:程序博客网 时间:2024/06/01 18:21

这里写图片描述
题目的意思是:给定一个非负整数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;      }  };  
0 0
原创粉丝点击