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

LeetCode演算法題-Reverse Bits(Java實現)

這是悅樂書的第185次更新,第187篇原創

01 看題和準備

今天介紹的是LeetCode演算法題中Easy級別的第44題(順位題號是190)。給定32位無符號整數,求它的反轉位。例如:

輸入:43261596

輸出:964176192

說明:43261596以二進位制表示為00000010100101000001111010011100,

964176192以二進位制表示為00111001011110000010100101000000。

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

02 第一種解法

既然是做位運算,那麼依次將原數從左往右移動一位,取出移動的位判斷是0還是1,然後加到反轉的結果上,並且反轉的結果是從右往左移動一位,迴圈控制的次數為32次,因為是32位整數。

其中涉及到左移、右移、與(&)運算,與(&)運算的規則是相同的位上均為1時結果為1,否則結果為0,而左移、右移的規則就是從右往左補0和從左往右補0了。

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


03 第二種解法

可以將上面的步驟再簡化下,進入迴圈時,無論原數右移出來的位是0還是1,都需要結果值左移一位,對此我們可以進行或(|)運算操作。

先將結果值左移一位,然後計算n和1的與(&)運算結果,再將兩數做或(|)運算,如果n和1的與(&)運算結果為1,那麼結果值就加1,為0就加0。

或(|)運算的規則是當兩邊運算元的位有一邊為1時,結果為1,否則為0。

public int reverseBits2(int n) {
    int result = 0;
    for (int i = 0; i < 32; i++) {
        result = (result << 1) | (n & 1);
        n >>= 1;
    }
    return result;
}


04 第三種解法

先將原數轉為二進位制字串,再利用StringBuilder的reverse方法得到反轉的二進位制字串,再將二進位制字串變為整數返回。

public int reverseBits3(int n) {
    String inputBinary = this.decimalToBinary(n);
    String reversedInputBinary = new StringBuilder(inputBinary).reverse().toString();
    return this.binaryToDecimal(reversedInputBinary);
}

private String decimalToBinary(int n) {
    StringBuilder sb = new StringBuilder();
    while (Integer.compareUnsigned(n, 0) > 0) {
        sb.append(Integer.remainderUnsigned(n, 2));
        n = Integer.divideUnsigned(n, 2);
    }
    while (sb.length() < 32) {
        sb.append('0');
    }
    return sb.reverse().toString();
}

private int binaryToDecimal(String str) {
    int res = 0;
    for (char c: str.toCharArray()) {
        res *= 2;
        res += c == '0' ? 0 : 1;
    }
    return res;
}


05 第四種解法

利用包裝類Integer自帶的方法,reverse()方法即可反轉原數。

public int reverseBits4(int n) {
    return Integer.reverse(n);
}


06 小結

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

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