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+篇,公眾號對話方塊回覆【資料結構與演算法】、【演算法】、【資料結構】中的任一關鍵詞,獲取系列文章合集。
以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支援!