判斷整數是否為回文數,要求不使用額外空間(即不能轉字符串)。本文提供**反轉後半部數字與前半部比較**的 O(log n) 時間 O(1) 空間最優解,並分析溢出風險、邊界處理與負數判斷。
將數字「對折」比較:不斷取末位數字構建反轉數 `reverted`,直到 `reverted >= x`(原數已縮減至前半部)。最後比較 `x == reverted`(偶數位)或 `x == reverted/10`(奇數位,去掉中間位)。
bool isPalindrome(int x) {
// 排除負數、尾部為0的非零數(如 10, 100)
if (x < 0 || (x % 10 == 0 && x != 0)) return false;
int reverted = 0;
while (x > reverted) {
reverted = reverted * 10 + x % 10;
x /= 10;
}
// 偶數位:x == reverted;奇數位:x == reverted/10(去掉中間位)
return x == reverted || x == reverted / 10;
}
x=12321
迭代1: x=1232, reverted=1
迭代2: x=123, reverted=12
迭代3: x=12, reverted=123 → x < reverted 停止
比較: x(12) == reverted/10(12) → true
bool isPalindrome_full(int x) {
if (x < 0) return false;
long long orig = x, rev = 0;
while (x) { rev = rev * 10 + x % 10; x /= 10; }
return orig == rev;
}
需 `long long` 存儲反轉值,C99 支持,但不如半數反轉優雅。
| 輸入 | 輸出 | 說明 |
|---|---|---|
| 121 | true | 標準回文 |
| -121 | false | 負數 |
| 10 | false | 尾部0 |
| 0 | true | 單位數 |
| 12321 | true | 奇數位 |
| 1221 | true | 偶數位 |
| 2147483647 | false | INT_MAX |
回文數判斷的精髓在於**原地反轉半數數字**。此法完美規避溢出、無額外空間、邏輯緊湊,是面試中展示數學建模與位運算功力的標準答案。掌握「循環條件 `x > reverted`、奇偶位統一返回」兩個細節,即可寫出無 Bug 代碼。