LeetCode精選TOP面試題191. 位1的個數

題目描述

編寫一個函數,輸入是一個無符號整數,返回其二進制表達式中數字位數爲 ‘1’ 的個數(也被稱爲漢明重量)。

示例 1:
輸入:00000000000000000000000000001011
輸出:3
解釋:輸入的二進制串 00000000000000000000000000001011 中,共有三位爲 '1'
示例 2:
輸入:00000000000000000000000010000000
輸出:1
解釋:輸入的二進制串 00000000000000000000000010000000 中,共有一位爲 '1'
示例 3:
輸入:11111111111111111111111111111101
輸出:31
解釋:輸入的二進制串 11111111111111111111111111111101 中,共有 31 位爲 '1'

解題思路

  • 思路1
    轉換成二進制字符串,for循環統計字符1出現的次數,並返回 最終的和;
  • 思路2
    遍歷數字的 32 位,進行按位與運算,如果某一位是 1 ,計數器就加 1,在此過程中讓輔助的與運算對象不斷左移,這樣來保證按位與
  • 思路3
    在思路2按位與的基礎上進行優化,讓n不斷和和n - 1 進行與運算,並把每次與運算的結果賦值給n,這樣能保證只要n 等於 0,那麼統計就結束了,每進行一次與運算,就說明當前n的二進制中還有1存在。

代碼(Java)

  • 思路1
// 字符串 - 循環計數
public class Solution {
    public int hammingWeight(int n){
        int count = 0;
        String str = Integer.toBinaryString(n);
        for (int i = 0; i < str.length(); i++){
            if (str.charAt(i) == '1'){
                count ++;
            }
        }
        return count;
    }
}
  • 思路2
// 按位與
public class Solution {
    public int hammingWeight(int n){
        int count = 0;
        int mask = 1;
        for (int i = 0; i < 32; i++) {
            if ((n & mask) != 0) {
                count++;
            }
            mask <<= 1;
        }
        return count;
    }
}
  • 思路3
// 優化的按位與
public class Solution {
    public int hammingWeight(int n){
        int count= 0;
        while (n != 0) {
            count++;
            n &= (n - 1);
        }
        return count;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章