判斷整數是否為回文數。負數不是回文。不能使用額外空間(即不能轉字符串)。
bool isPalindrome(int x) {
if (x < 0) return false;
long long rev = 0, orig = x;
while (x) { rev = rev * 10 + x % 10; x /= 10; }
return rev == orig;
}
用 `long long` 避免溢出,但違反「無額外空間」精神。
只反轉後一半數字,與前一半比較。
bool isPalindrome(int x) {
if (x < 0 || (x % 10 == 0 && x != 0)) return false;
int rev = 0;
while (x > rev) {
rev = rev * 10 + x % 10;
x /= 10;
}
return x == rev || x == rev / 10; // 奇數長度去掉中間位
}
循環條件 `x > rev` 確保只反轉一半。奇數長度時 `rev` 多一位,比較時 `/10` 去掉。
bool isPalindrome(int x) {
if (x < 0) return false;
int div = 1;
while (x / div >= 10) div *= 10; // 最高位權重
while (x) {
int left = x / div;
int right = x % 10;
if (left != right) return false;
x = (x % div) / 10; // 去掉首尾位
div /= 100;
}
return true;
}
def isPalindrome(x):
s = str(x)
return s == s[::-1]
| 方法 | 時間 | 空間 | 優點 | 缺點 |
|---|---|---|---|---|
| 完全反轉 | O(log n) | O(1) | 簡單 | 需長整型防溢出 |
| 半反轉 | O(log n) | O(1) | 標準解法、無溢出 | 邊界條件稍繁 |
| 首尾對比 | O(log n) | O(1) | 直觀、易理解 | 需計算 div、除法較慢 |