zoukankan      html  css  js  c++  java
  • Java [Leetcode 338]Counting Bits

    题目描述:

    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.

    Hint:

      1. You should make use of what you have produced already.
      2. Divide the numbers in ranges like [2-3], [4-7], [8-15] and so on. And try to generate new range from previous.
      3. Or does the odd/even status of the number help you in calculating the number of 1s?

    解题思路:

    0     0000

    1     0001

    2     0010

    3     0011

    4     0100

    5     0101

    6     0110

    7     0111

    8     1000

    9     1001

    10   1010

    11   1011

    12   1100

    13   1101

    14   1110

    15   1111

    ........

    观察上面的情况,我们发现0,1,2-3,4-7,8-15为一组,且每组开头的1的位数都是1。每组其余的数都可以用本组开头的数加上另一个差值。且这两个数都已经在前面算过了。

    代码如下:

    public class Solution{
    	public int[] countBits(int num){
    		int[] res = new int[num + 1];
    		int pow = 1, k = 1;
    		res[0] = 0;
    		while(k <= num){
    			if(k == pow){
    				pow *= 2;
    				res[k++] = 1;
    			} else {
    				res[k] = res[pow / 2 ] + res[k - pow / 2];
    				k++;
    			}
    		}
    		return res;
    	}
    }
    
  • 相关阅读:
    Java集合类框架的基本接口有哪些?
    JSR303校验 —— hibernate-validator实现
    JSON和对象或集合间的转换
    Servlet 单例、多线程
    session.invalidate()
    request获取各种路径
    动态加载类并实例化对象 —— newInstance
    js 事件冒泡和事件捕获
    js事件绑定
    css 选择器和优先级
  • 原文地址:https://www.cnblogs.com/zihaowang/p/5310806.html
Copyright © 2011-2022 走看看