leetcode 338. Counting Bits(C语言,二进制中1的个数)39
2017-10-21 17:18
597 查看
贴原题:
解析:
本题就是给出一个数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得到的。
贴代码:
复杂解法://此解法的复杂度应该是超出了O(n),虽然leetcode没有报错,但不值得借鉴
解析:
本题就是给出一个数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; }
相关文章推荐
- leetcode-338. Counting Bits 统计十进制数字的二进制表示中1的个数,列表的定义,奇偶判断
- leetcode 338. Counting Bits 位计算 + 统计二进制1的数量
- Leetcode338. Counting Bits
- LeetCode:338. Counting Bits(C++)
- LeetCode--338. Counting Bits(计算比特数)Python
- LeetCode 338. Counting Bits
- LeetCode 338. Counting Bits
- LeetCode 338. Counting Bits
- LeetCode 338. Counting Bits
- [leetcode] 338. Counting Bits
- (leetcode) 338. Counting Bits
- Leetcode 338. Counting Bits
- leetcode - 338. Counting Bits (bit mannipulation)
- 【leetcode】338. Counting Bits
- leetcode 338. Counting Bits
- LeetCode题目:338. Counting Bits
- LeetCode 338. Counting Bits
- LeetCode: 338. Counting Bits
- 【LeetCode】338. Counting Bits
- 338. Counting Bits 数字的二进制中1的个数