zoukankan      html  css  js  c++  java
  • 算法:Number of 1 Bits 收藏

    Approach #1 (Loop and Flip) [Accepted]

    Algorithm

    The solution is straight-forward. We check each of the 3232 bits of the number. If the bit is 11, we add one to the number of 11-bits.

    We can check the i^{th}ith​​ bit of a number using a bit mask. We start with a mask m=1m=1, because the binary representation of 11 is,

    0000 0000 0000 0000 0000 0000 0000 00010000 0000 0000 0000 0000 0000 0000 0001

    Clearly, a logical AND between any number and the mask 11 gives us the least significant bit of this number. To check the next bit, we shift the mask to the left by one.

    0000 0000 0000 0000 0000 0000 0000 00100000 0000 0000 0000 0000 0000 0000 0010

    And so on.

    Java

    public int hammingWeight(int n) {
        int bits = 0;
        int mask = 1;
        for (int i = 0; i < 32; i++) {
            if ((n & mask) != 0) {
                bits++;
            }
            mask <<= 1;
        }
        return bits;
    }
    

    Complexity Analysis

    The run time depends on the number of bits in nn. Because nn in this piece of code is a 32-bit integer, the time complexity is O(1)O(1).

    The space complexity is O(1)O(1), since no additional space is allocated.


    Approach #2 (Bit Manipulation Trick) [Accepted]

    Algorithm

    We can make the previous algorithm simpler and a little faster. Instead of checking every bit of the number, we repeatedly flip the least-significant 11-bit of the number to 00, and add 11 to the sum. As soon as the number becomes 00, we know that it does not have any more 11-bits, and we return the sum.

    The key idea here is to realize that for any number nn, doing a bit-wise AND of nn and n - 1n1 flips the least-significant 11-bit in nn to 00. Why? Consider the binary representations of nn and n - 1n1.

    Number of 1 Bits

    Figure 1. AND-ing nn and n-1n1 flips the least-significant 11-bit to 0.

    In the binary representation, the least significant 11-bit in nn always corresponds to a 00-bit in n - 1n1. Therefore, anding the two numbers nn and n - 1n1 always flips the least significant 11-bit in nn to 00, and keeps all other bits the same.

    Using this trick, the code becomes very simple.

    Java

    public int hammingWeight(int n) {
        int sum = 0;
        while (n != 0) {
            sum++;
            n &= (n - 1);
        }
        return sum;
    }
    

    Complexity Analysis

    The run time depends on the number of 11-bits in nn. In the worst case, all bits in nn are 11-bits. In case of a 32-bit integer, the run time is O(1)O(1).

    The space complexity is O(1)O(1), since no additional space is allocated.

    Analysis written by: @noran.

  • 相关阅读:
    深入解析ES6中的promise
    深入解析ES6中的promise
    2019年底前的web前端面试题初级-web标准应付HR大多面试问题
    2019年底前的web前端面试题初级-web标准应付HR大多面试问题
    ES6基础-ES6的扩展
    ES6基础-ES6的扩展
    小程序-优化,部署,细节功能
    小程序-优化,部署,细节功能
    小程序基础-组件
    小程序基础-组件
  • 原文地址:https://www.cnblogs.com/lwy1103/p/9018859.html
Copyright © 2011-2022 走看看