Given a non negative integer number num. For every numbers i in the range 0 ≤ i ≤ num calculate the number of 1's in their binary representation and return them as an array.
Example:
For num = 5
you should return [0,1,1,2,1,2]
.
Follow up:
- It is very easy to come up with a solution with run time O(n*sizeof(integer)). But can you do it in linear time O(n) /possibly in a single pass?
- Space complexity should be O(n).
- Can you do it like a boss? Do it without using any builtin function like __builtin_popcount in c++ or in any other language.
题目也说实现不难,但是要复杂度是线性的,就要用心想想了,偶数的二进制最后因为为零,所以一的个数等于右一位那个数,奇数原理一样;
int* countBits(int num, int* returnSize)
{
int *a = (int *)malloc(sizeof(int)*(num+1));
int i;
*returnSize = num+1;
if(num == 0)
{
a[0] = 0;
return a;
}
a[0] = 0;
a[1] = 1;
for(i=0;i<=num;i++)
{
if(i%2==0)
a[i]=a[i>>1];
else
a[i] = a[i>>1]+1;
}
return a;
}