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

LeetCode 9. 回文數:無額外空間數學反轉半數法 C 語言解法

     編輯:關於C語言

LeetCode 9. 回文數:無額外空間數學反轉半數法 C 語言解法

判斷整數是否為回文數,要求不使用額外空間(即不能轉字符串)。本文提供**反轉後半部數字與前半部比較**的 O(log n) 時間 O(1) 空間最優解,並分析溢出風險、邊界處理與負數判斷。

核心思路:反轉一半數字

將數字「對折」比較:不斷取末位數字構建反轉數 `reverted`,直到 `reverted >= x`(原數已縮減至前半部)。最後比較 `x == reverted`(偶數位)或 `x == reverted/10`(奇數位,去掉中間位)。

C 語言實現(反轉半數)

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

關鍵點深度解析

  • 負數直接 false:`-121` 反轉是 `121-`,非回文。
  • 尾部 0 特判:`10`、`100` 等尾部為 0 的非零數,反轉會有前導 0,不可能回文(除非是 0 本身)。
  • 循環條件 `x > reverted`** 精準停在中點:
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
  • 無溢出風險:`reverted` 最大不超過原數一半位數,遠小于 `INT_MAX`(2147483647)。若反轉整個數可能溢出(如 1999999999),本法避免了此問題。
  • 奇偶位統一處理:`x == reverted/10` 兼容奇數位(去掉中間位),偶數位時 `reverted/10` 少一位不會誤判等於 `x`(因循環條件保證 `x <= reverted`)。

對比:反轉整數法(需長整型防溢出)

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 支持,但不如半數反轉優雅。

複雜度分析

  • 時間:O(log₁₀ n) —— 位數決定循環次數。
  • 空間:O(1) —— 僅幾個整數變量。

測試用例

輸入輸出說明
121true標準回文
-121false負數
10false尾部0
0true單位數
12321true奇數位
1221true偶數位
2147483647falseINT_MAX

常見錯誤總結

  1. 用 `int` 反轉整數導致溢出未檢測。
  2. 未特判 `x % 10 == 0` 導致 `10` 判為 true(反轉得 01 → 1,原數縮減為 1,誤判相等)。
  3. 循環條件寫成 `x != 0` 反轉整個數,失去「半數」優勢且引入溢出風險。
  4. 字符串法違反「無額外空間」要求(雖然面試常接受,但非最優)。

總結

回文數判斷的精髓在於**原地反轉半數數字**。此法完美規避溢出、無額外空間、邏輯緊湊,是面試中展示數學建模與位運算功力的標準答案。掌握「循環條件 `x > reverted`、奇偶位統一返回」兩個細節,即可寫出無 Bug 代碼。

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