題目:
給定一個 32 位元有號整數 x,請你回傳它的數字「反轉後」的結果。
範例:
想法:
先讀到最後一位,並儲存——>先進先出FIFO
!更正!:
逐位取出最後一位數字,再「推入」新數字的尾端
為什麼?
不是FIFO(Queue),而是做「數學位數運算」 流程如下
- 取出最後一位 → pop = x % 10
- 去掉最後一位 → x = x / 10
- 組裝到新數字 → rev = rev * 10 + pop
用stack會花費太多空間(需要 O(n) 的空間)程式冗長
所以不需要「先進後出」或「先進先出」的資料結構
程式碼:
class Solution {
public int reverse(int x) {
int rev = 0;
while (x != 0) {
int pop = x % 10; // 取最後一位
x /= 10; // 去掉最後一位
// 檢查是否會超過 int 範圍
if (rev > Integer.MAX_VALUE / 10 || (rev == Integer.MAX_VALUE / 10 && pop > 7)) {
return 0;
}
if (rev < Integer.MIN_VALUE / 10 || (rev == Integer.MIN_VALUE / 10 && pop < -8)) {
return 0;
}
rev = rev * 10 + pop; // 把數字推進去
}
return rev;
}
}
溢位判斷
因為 int 最大值 2147483647,最小值 -2147483648,所以:
- 當 rev > Integer.MAX_VALUE/10 → 下一步一定會溢位
- 當 rev == Integer.MAX_VALUE/10 && pop > 7 → 也會溢位
- 當 rev < Integer.MIN_VALUE/10 → 下一步一定會溢位
- 當 rev == Integer.MIN_VALUE/10 && pop < -8 → 也會溢位
實際操作:
範例一:x = 123
STEP1
x = 123 ——>pop = 3
rev = 0 * 10 + 3 = 3
STEP2
x = 12 ——>pop = 2
rev = 3 * 10 + 2 = 32
STEP3
x = 1 ——>pop = 1
32 * 10 + 1 = 321
STEP4
x = 0 ——>結束
輸出:321
範例二:x = 1534236469
因rev * 10 + pop 會超過 2147483647
因此直接回傳 0