难度: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)