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






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值