正著讀與反著讀都一樣的整數。例如:121、123321、0、11。負數通常不視為迴文 (負號位置固定)。
public class PalindromeNumber {
/** 判斷整數是否為迴文
* @param x 輸入整數
* @return true 若為迴文
*/
public static boolean isPalindrome(int x) {
// 負數、個位為 0 但非 0 本身 (如 10, 100) 直接 false
if (x < 0 || (x % 10 == 0 && x != 0)) return false;
int reversed = 0;
while (x > reversed) {
reversed = reversed * 10 + x % 10;
x /= 10;
}
// 奇數位:中間位數字在 reversed 最後一位,除以 10 比較
// 偶數位:直接比較
return x == reversed || x == reversed / 10;
}
public static void main(String[] args) {
int[] test = {121, -121, 10, 0, 123321, 12321, 1001, 1000021};
for (int n : test) {
System.out.printf("%d -> %b%n", n, isPalindrome(n));
}
}
}
x > reversed,當原數 ≤ 反轉數時停止,避免整數溢位 (反轉完整可能超過 Integer.MAX_VALUE)。x=123, reversed=321 → x == reversed/10 (123 == 32) false? 實際上 123321 循環:x=123321,r=0 → x=12332,r=1 → x=1233,r=12 → x=123,r=123 停止 → x==reversed (123==123) true。x=12, reversed=123 → x == reversed/10 (12 == 12) true。
public static boolean isPalindromeString(long x) {
if (x < 0) return false;
String s = String.valueOf(x);
int l = 0, r = s.length() - 1;
while (l < r) {
if (s.charAt(l++) != s.charAt(r--)) return false;
}
return true;
}
// 或一行流:new StringBuilder(s).reverse().toString().equals(s)
| 維度 | 數學反轉法 | 字串法 |
|---|---|---|
| 時間複雜度 | O(log₁₀ n) — 只跑一半位數 | O(log₁₀ n) — 全長度比較 |
| 空間複雜度 | O(1) | O(log₁₀ n) — 建立字串/StringBuilder |
| 溢位風險 | 無 (只反轉一半) | 無 |
| 支援 long | 需改用 long 變數 | 原生支援任意長度 (BigInteger 轉字串) |
| 可讀性 | 中等 | 高 |
| 推薦場景 | 演算法面試、高頻呼叫、嵌入式環境 | 業務代碼、長整數、快速開發 |
class Solution {
public boolean 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;
}
}
public static boolean isPalindromeString(String s) {
int l = 0, r = s.length() - 1;
while (l < r) {
char cl = Character.toLowerCase(s.charAt(l));
char cr = Character.toLowerCase(s.charAt(r));
if (!Character.isLetterOrDigit(cl)) { l++; continue; }
if (!Character.isLetterOrDigit(cr)) { r--; continue; }
if (cl != cr) return false;
l++; r--;
}
return true;
}
// "A man, a plan, a canal: Panama" -> true
掌握「只反轉一半」技巧,不僅解決迴文數,同樣適用於「反轉整數 (LeetCode 7)」、「回文鏈表 (LeetCode 234)」等經典題型,是演算法面試必備基本功。