牛客華為機試HJ15
阿新 • • 發佈:2022-04-02
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)