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.
题意
给定一个数num,然后对于每一个i(0<=i<=num),计算它包含1的数量。
思路
最简单的思路就是循环,然后对于i做与运算(&),然后再做移位运算,知道i==0为止。
代码
public static int[] countBits(int num) {
int [] result = new int[num+1];
for(int i=0;i<=num;i++){
int value = i;
int count =0;
while(value !=0){
if((value & 1) == 1){
++count;
}
value = value >>1;
}
result[i] = count;
}
return result;
}
但是题目中要求时间复杂度为O(n),上面的代码不符合要求。然后参考别人的代码,学习到一种机智的方法:
public static int[] countBits(int num){
int[] f = new int[num + 1];
for (int i=1; i<=num; i++)
f[i] = f[i >> 1] + (i & 1);
return f;
}
至于为什么这样做可以,背后的逻辑其实不是很懂。另外需要主要:
i>>1相当于i/2
i&1相当于i%2