难度:Medium
题目大意:给定一个非负整数num,对于每一个整数0<=i<=num,统计i二进制表示中的1的数量,并输出所有i的排列。
例如,给定num=5,输出[0,1,1,2,1,2]。
思路:我自己先写了0~20的结果,发现了如下规律:
1.按1,2~3,4~7,8~15......分组,即2的i次方~2的(i+1)次方减1;
2.每组的前半部分与前一组相同,后半部分为前半部分的结果+1;
具体可以看代码。
code:
/**
* Return an array of size *returnSize.
* Note: The returned array must be malloced, assume caller calls free().
*/
int* countBits(int num, int* returnSize) {
int i=1,temp;
int a, b, c;
int *s;
*returnSize = num+1;
s = (char*)malloc((num+1)*sizeof(int));
s[0]=0;
if(num == 0) return s;
s[1] = 1;
if(num == 1) return s;
a = (int)pow(2,i);
for(temp=0;a+temp<=num;temp++){
a = (int)pow(2,i);
b = (int)pow(2,i-1);
c = (int)pow(2,i+1);
if((b+temp)
本文详细介绍了如何给定一个非负整数num,统计其范围内每个整数二进制表示中1的数量,并输出所有整数的排列。通过观察发现规律,分为分组、前半部分与前一组的关系来解决问题。
1226

被折叠的 条评论
为什么被折叠?



