LeetCode 二進(jìn)制中1的個數(shù) [簡單]
請實(shí)現(xiàn)一個函數(shù),輸入一個整數(shù),輸出該數(shù)二進(jìn)制表示中 1 的個數(shù)。例如,把 9 表示成二進(jìn)制是 1001,有 2 位是 1。因此,如果輸入 9,則該函數(shù)輸出 2。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/er-jin-zhi-zhong-1de-ge-shu-lcof
示例 1:
輸入:00000000000000000000000000001011
輸出:3
解釋:輸入的二進(jìn)制串 00000000000000000000000000001011 中,共有三位為 '1'。
示例 2:
輸入:00000000000000000000000010000000
輸出:1
解釋:輸入的二進(jìn)制串 00000000000000000000000010000000 中,共有一位為 '1'。
示例 3:
輸入:11111111111111111111111111111101
輸出:31
解釋:輸入的二進(jìn)制串 11111111111111111111111111111101 中,共有 31 位為 '1'。
題目分析
解法1
先把數(shù)字轉(zhuǎn)換為二進(jìn)制,然后迭代計數(shù) 但是處理到 2 / 2 % 2 || 1==1 的時候就掛機(jī)了
解法2
使用Java的API return Integer.bitCount(n);
解法3
使用Java的API return Integer.toBinaryString(n).replaceAll("0", "").length();
解法4
逐位判斷 根據(jù) 與運(yùn)算 定義,設(shè)二進(jìn)制數(shù)字 nn ,則有:
若 n & 1 = 0n&1=0 ,則 nn 二進(jìn)制 最右一位 為 0 ;
若 n & 1 = 1n&1=1 ,則 nn 二進(jìn)制 最右一位 為 1 。
根據(jù)以上特點(diǎn),考慮以下 循環(huán)判斷 :
判斷 n 最右一位是否為 1 ,根據(jù)結(jié)果計數(shù)。
將 n 右移一位(本題要求把數(shù)字 nn 看作無符號數(shù),因此使用 無符號右移 操作)。解法5
(n?1) 解析: 二進(jìn)制數(shù)字 n 最右邊的 1 變成 0 ,此 1 右邊的 0 都變成 1 。
n & (n - 1) 解析: 二進(jìn)制數(shù)字 n 最右邊的 1 變成 0 ,其余不變。
代碼實(shí)現(xiàn)
public class HammingWeight {
public static void main(String[] args) {
System.out.println(hammingWeight(255));
System.out.println(hammingWeight1(255));
System.out.println(hammingWeight2(255));
System.out.println(hammingWeight3(255));
}
public static int hammingWeight3(int n) {
int res = 0;
while (n != 0) {
res++;
n &= n - 1;
}
return res;
}
public static int hammingWeight2(int n) {
int res = 0;
while (n != 0) {
res += n & 1;
n >>>= 1;
}
return res;
}
public static int hammingWeight1(int n) {
return Integer.toBinaryString(n).replaceAll("0", "").length();
}
public static int hammingWeight(int n) {
return Integer.bitCount(n);
}
}
