LeetCode-338. Counting Bits (Java)

来源:互联网 发布:淘宝推广佣金 编辑:程序博客网 时间:2024/06/08 00:29

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






原创粉丝点击