1. 程式人生 > >LeetCode演算法題-Number of 1 Bits(Java實現)

LeetCode演算法題-Number of 1 Bits(Java實現)

這是悅樂書的第186次更新,第188篇原創

01 看題和準備

今天介紹的是LeetCode演算法題中Easy級別的第45題(順位題號是191)。編寫一個帶無符號整數的函式,並返回它所具有的“1”位數。例如:

輸入:11
輸出:3
說明:整數11具有二進位制表示00000000000000000000000000001011

輸入:128
輸出:1
說明:整數128具有二進位制表示00000000000000000000000010000000

本次解題使用的開發工具是eclipse,jdk使用的版本是1.8,環境是win7 64位系統,使用Java語言編寫和測試。

02 第一種解法

這道題與昨天的題類似,都是和位操作有關。此題是統計二進位制位“1”的出現次數,對此可以使用與(&)運算,對於n還是依次從左往右移動。

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


03 第二種解法

對於上面的解法,還可以再簡化下,省掉那個判斷,因為和1做與運算,如果最後一位是1,整個運算結果就是1,就相當於是自增加1。

public int hammingWeight2(int n) {
    int count = 0;
    for (int i=0; i<32; i++) {
        count += n&1;
        n = n >> 1;
    }
    return count;
}


04 第三種解法

上面的兩種解法都是拿n和1做與運算,其實還可以換種思路,使用n和n-1做位運算。此時,分兩種情況:當n的二進位制最後一位是1的時候,n-1的二進位制位除了最後一位和n不一樣,其他位都是一樣的,此時n&(n-1)得到的結果是n-1,此時消除的是n的二進位制最後一位;當n的二進位制最後一位是0的時候,n-1的二進位制位最後一位是1,n從最後一位1往左開始和n-1的對應位是一樣的,此時n&(n-1)得到的是n最後一位1出現位置往左之前的位,此時消除的n的二進位制位中最後出現的1。每次都會消除一位1,直到n最後變成0。

例如:

10 1010
9 1001
與:1000

14 1110
13 1101
與:1100

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


05 第四種解法

將n變成二進位制字串,然後依次查詢字串中的1,並記數。其中,整數1的Unicode十進位制值是49,所以使用charAt方法時,是和49判斷。

public int hammingWeight4(int n) {
    int count =0;
    String binary = Integer.toBinaryString(n);
    for (int i =0; i<binary.length(); i++) {
        if (binary.charAt(i) == 49) {
            count++;
        }      
    }
    return count;
}


06 第五種解法

直接使用包裝類Integer自帶的方法bitCount即可。

public int hammingWeight5(int n) {
    return Integer.bitCount(n);
}


07 小結

演算法專題目前已連續日更超過一個月,演算法題文章45+篇,公眾號對話方塊回覆【資料結構與演算法】、【演算法】、【資料結構】中的任一關鍵詞,獲取系列文章合集。

以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支援!