1. 程式人生 > 其它 >牛客華為機試HJ15

牛客華為機試HJ15

原題傳送門

1. 題目描述

2. Solution 1

1、思路分析
將二進位制的每一位依次與1作與運算,計數。

2、程式碼實現

public int bitCount(int i) {
    int count = 0;
    do {
        if ((i & 1) == 1) {
            count++;
        }
        i >>= 1;
    } while (i > 0);

    return count;
} 

3、複雜度分析
時間複雜度: O(n)
空間複雜度: O(1)

3. Solution 2

1、思路分析
將整數減一後與原數作與運算,達到將原二進位制最低位"1"重置為"0"的目的。
如, n=5, bin(n)=bin(5) = 0101, bin(n-1)=bin(4)=0100, bin(5) & bin(4) = 0100
bin(3) = 0011, bin(4) & bin(3) = 0000。
計算共進行了2次,故5的二進位制中有2個1。

2、程式碼實現

public int countBit(int i) {
    int count = 0;
    while (i > 0) {
        i = i & (i - 1); // 抹除二進位制中最低位的1
        count++;
    }

    return count;
}

3、複雜度分析
時間複雜度: O(n)
空間複雜度: O(1)

4. Solution 3

1、思路分析
使用Java內建靜態方法 Integer.bitCount
先每兩位一組統計二進位制中的"1",然後每四位一組統計"1",接著是8位、16位和32位,最終再與0x3f作與運算,輸出結果。
取,n=2871,bin(2871)=101100110111,如下圖所示,推演計算過程

             二進位制                       十進位制
1  0  1  1  0  0  1  1  0  1  1  1    10 11 00 11 01 11
 01    10    00    10    01    10     1  2  0  2  1  2
    \ /         \ /         \ /        \ /   \ /   \ /
    0011        0010        0011        3     2     3
                    \       /           3      \   /
    0011               0101             3        5
        \             /                  \      /
              1000                          8
          
              2871的二進位制中的1的位數計算過程

演算法原型:

public static int bitCount(int i) {
    // HD, Figure 5-2
    i = i - ((i >>> 1) & 0x55555555);
    i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);
    i = (i + (i >>> 4)) & 0x0f0f0f0f;
    i = i + (i >>> 8);
    i = i + (i >>> 16);
    return i & 0x3f;
}

2、程式碼實現

package huawei.HJ015;

import java.io.IOException;
import java.nio.file.Paths;
import java.util.Scanner;

public class Main {
    static Scanner in;

    public static void main(String[] args) throws IOException {
        if (!"Linux".equals(System.getProperty("os.name"))) {
            in = new Scanner(Paths.get("/Users/jun/Documents/Learn/JavaLearning/NowCoder/src/huawei/HJ015/input.txt"));
        } else {
            in = new Scanner(System.in);
        }
        while (in.hasNext()) {
            int n = in.nextInt();
            solve(n);
        }
    }

    private static void solve(int n) {
        System.out.println(Integer.bitCount(n));
    }
}

3、複雜度分析
時間複雜度: O(1)
空間複雜度: O(1)

5. Python 解法

import sys

if sys.platform != "linux":
    sys.stdin = open("input/HJ15.txt")


def solve(n):
    n_bin = bin(n).replace("0b", "")
    print(n_bin.count('1'))


for line in sys.stdin:
    n = int(line.strip())
    solve(n)