LeetCode-338. Counting Bits (Java)

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






你可能感兴趣的:(实实在在刷点题,LeetCode,Counting,Bits,Java,位运算)