LeetCode 題解之 190. Reverse Bits
阿新 • • 發佈:2019-02-04
190. Reverse Bits
題目描述和難度
- 題目描述:
顛倒給定的 32 位無符號整數的二進位制位。
示例:
輸入: 43261596 輸出: 964176192 解釋: 43261596 的二進位制表示形式為 00000010100101000001111010011100 , 返回 964176192,其二進位制表示形式為 00111001011110000010100101000000 。
進階:
如果多次呼叫這個函式,你將如何優化你的演算法?
思路分析
求解關鍵:這道題並不難,可以用字串的方法來做,也可以用位運算的方法來做。
參考解答
參考解答1
public class Solution {
// you need treat n as an unsigned value
// 00000010100101000001111010011100
// 10100101000001111010011100
/**
* 比較簡單粗暴,拿字串轉來轉去
*
* @param n
* @return
*/
public int reverseBits(int n) {
String toBinaryString = Long.toBinaryString(n);
StringBuilder stringBuilder = new StringBuilder(toBinaryString);
// 不夠 32 位的左補 0
while (stringBuilder.length() < 32) {
stringBuilder.insert(0, 0);
}
String str = stringBuilder.reverse().toString();
return Integer.valueOf(str, 2);
}
public static void main(String[] args) {
Solution solution = new Solution();
int n = 43261596;
int reverseBits = solution.reverseBits(n);
System.out.println(reverseBits);
}
}
參考解答2
public class Solution2 {
// you need treat n as an unsigned value
public int reverseBits(int n) {
// 0 其實不用特殊考慮
if (n == 0) {
return 0;
}
int res = 0;
// 這裡不能使用 while(n!=0) ,因為我們要考慮到最高位補 0 的情況
for (int i = 0; i < 32; i++) {
// 先左移,讓出位置來
res <<= 1;
// 當前考慮的這個數位是 0 還是 1
res += n & 1;
n >>= 1;
}
return res;
}
public static void main(String[] args) {
Solution2 solution2 = new Solution2();
int n = 43261596;
int reverseBits = solution2.reverseBits(n);
System.out.println(reverseBits);
}
}