首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 判斷迴文數:數學反轉法與字串法完整比較

     編輯:Java 相關知識

什麼是迴文數

正著讀與反著讀都一樣的整數。例如:121、123321、0、11。負數通常不視為迴文 (負號位置固定)。

方法一:數學反轉法 (不轉字串、O(1) 空間)


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));
        }
    }
}

核心邏輯解析

  1. 提前排除:負數不可能;尾數為 0 的非零數 (如 10) 反轉會少位數。
  2. 只反轉一半:迴圈條件 x > reversed,當原數 ≤ 反轉數時停止,避免整數溢位 (反轉完整可能超過 Integer.MAX_VALUE)。
  3. 奇偶位統一判斷:
    • 偶數位 (如 123321) → 迴圈結束 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。
    • 奇數位 (如 12321) → 迴圈結束 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 轉字串)
可讀性中等高
推薦場景演算法面試、高頻呼叫、嵌入式環境業務代碼、長整數、快速開發

LeetCode 9 迴文數 完整解法模板


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)」等經典題型,是演算法面試必備基本功。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved