利用 % 10 取個位,/ 10 右移去個位,將拆解出的數字按順序疊加構成反轉數:
public class NumberReverser {
public static int reverse(int num) {
int reversed = 0;
while (num != 0) {
int digit = num % 10; // 取最低位
reversed = reversed * 10 + digit; // 往高位疊加
num /= 10; // 右移去掉最低位
}
return reversed;
}
public static void main(String[] args) {
System.out.println(reverse(12345)); // 54321
System.out.println(reverse(-678)); // -876
System.out.println(reverse(1000)); // 1 (前導零自動丟棄)
System.out.println(reverse(0)); // 0
}
}
| 場景 | 處理方式 | 說明 |
|---|---|---|
| 負數 | 直接帶入算法 | Java % 保留被除數符號,-678 % 10 = -8,邏輯自洽 |
| 尾部零 | 自然丟棄 | 1000 → 1,符合整數語義 |
| 溢出 | 需額外檢查 | 反轉後超出 Integer.MAX_VALUE 會溢出,生產代碼需判斷 |
| 輸入 0 | while 不進入,直接返回 0 | 邊界正確 |
public static int reverseSafe(int num) {
int reversed = 0;
while (num != 0) {
int digit = num % 10;
// 溢出檢查:reversed * 10 + digit 是否超出 int 範圍
if (reversed > Integer.MAX_VALUE / 10 ||
(reversed == Integer.MAX_VALUE / 10 && digit > 7)) return 0; // 或拋異常
if (reversed < Integer.MIN_VALUE / 10 ||
(reversed == Integer.MIN_VALUE / 10 && digit < -8)) return 0;
reversed = reversed * 10 + digit;
num /= 10;
}
return reversed;
}
LeetCode 7 題標準解法,面試必背。
// 簡單但有性能開銷:對象創建、字符數組拷貝
public static int reverseStringWay(int num) {
String s = new StringBuilder(String.valueOf(num)).reverse().toString();
return Integer.parseInt(s); // 負號會跑到末尾需額外處理
}
數字反轉的標準解法是 %10 /10 迭代,時間 O(log n)、空間 O(1)。掌握溢出邊界檢查、負數語義、前導零特性,是基本功考察的高頻考點。