您的位置:首页 > 编程语言 > C语言/C++

leetcode 338. Counting Bits(C语言,二进制中1的个数)39

2017-10-21 17:18 567 查看
贴原题:



解析:

  本题就是给出一个数n,让以一个数组的形式返回0~n的二进制中1的个数。

  我们把每个数的二进制写下来:

  0

  1

  10

  11

  100

  101

  110

  111

  1000

  ……

  根据观察可以看出,10,11这两个数是由1分别在其后加0,1得到的;100,101是10分别在其后加0,1得到的,110、111是11分别在其后加0,1得到的……

  以此类推,我们可以得出结论——i的二进制是由i/2的二进制后加i%2得到的。

  

贴代码:

/**
* Return an array of size *returnSize.
* Note: The returned array must be malloced, assume caller calls free().
*/
int* countBits(int num, int* returnSize) {
*returnSize = num+1;
int *array = (int *)malloc(*returnSize * sizeof(int));
*array=0;//0的二进制有0个1
for(int i=0, cnt=0; i<=num; i++, cnt=0)
{
*(array+i)=*(array+i/2)+i%2;//根据解析写出的递推算法
}
return array;
}


复杂解法://此解法的复杂度应该是超出了O(n),虽然leetcode没有报错,但不值得借鉴

/**
* Return an array of size *returnSize.
* Note: The returned array must be malloced, assume caller calls free().
*/
int* countBits(int num, int* returnSize) {
*returnSize = num+1;
int *array = (int *)malloc(*returnSize * sizeof(int));
for(int i=0, cnt=0; i<=num; i++, cnt=0)
{
int x=i;
while(x)//直接算出该数二进制1的个数
{
if(x%2)
{
cnt++;
}
x/=2;
}
*(array+i)=cnt;
}
return array;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 leetcode 二进制