📘 題目敘述
給定一個 32 位元有號整數,請將它的位元反轉。
條件限制
0 <= n <= 2^31 - 2n是偶數
🧠 解題思路
我這份寫法是在做「逐位取出 + 逐位建立」。
我每次都從 n 的最低位開始取(用 n % 2),然後把它接到 ans 的尾端。
因為我要做的是反轉,所以「原本最低位」會變成「答案的最高位」,因此我每一輪都先把 ans 乘以 2(等價於左移一位),再把取出的 bit 加上去。
整個過程固定做 32 次,就能把 32 個位元完整反轉完。
所有變數
ans:正在建立的反轉結果(每輪把新 bit 接到 ans 右邊)
🪜 主要流程步驟
1. 初始化 ans = 0
ans 一開始是空的結果,所以設成 0。
2. 重複 32 次:每次把 n 的最低位搬到 ans 的右邊
每一輪都做同一件事:
先用 n % 2 取得 n 的最低位。
再用 ans = 2 * ans + n % 2 把 ans 左移一格並把這個 bit 放進去。
這樣連做 32 次,就等於把 n 的 bit 從低到高取出,依序塞到 ans,最後就變成反轉。
3. 每輪都把 n 右移一位
我用 n = (n - n % 2) / 2 把最低位移除,讓下一輪可以取到下一個 bit。
4. 回傳 ans
32 次做完後,ans 就是反轉後的整數。
⏱️ 複雜度
- 時間複雜度:
O(32),也就是O(1) - 空間複雜度:
O(1)
💻 程式碼實作
class Solution {
public:
int reverseBits(int n) {
int ans = 0;
for (int i = 0; i < 32; i++) {
ans = 2 * ans + n % 2;
n = (n - n % 2) / 2;
}
return ans;
}
};
🔗 題目連結
https://leetcode.com/problems/reverse-bits/