題目描述:判斷一個整數 x 是否為回文數(正著讀和倒著讀都一樣的數)。要求不能將數字轉換成字串來處理。
解題思路:關鍵觀察是負數和個位數為 0 的正整數(0 本身除外)一定不是回文數。對於其他情況,我們只需要反轉數字的後半部分,然後與前半部分比較,而不必反轉整個數字(避免溢位問題)。
做法是持續從 x 中取出最低位數字,建構反轉後半段數字 rev,同時將 x 縮短。當 x <= rev 時,說明我們已經處理了一半以上的數字:
此方法完全在整數範圍內操作,無需字串轉換,也不會有溢位風險。
時間複雜度:O(log n) — 我們只反轉了數字的後半部分,迭代次數為數字位數的一半,而位數約為 log10(n)。
空間複雜度:O(1) — 只使用常數個整數變數,不需要額外的陣列或字串空間。
1. If x < 0, return false (negative numbers are not palindromes) 2. If x != 0 and x % 10 == 0, return false (trailing zero means it can't be a palindrome) 3. Initialize rev = 0 4. While x > rev: a. rev = rev * 10 + x % 10 (append last digit of x to rev) b. x = x / 10 (remove last digit from x) 5. Return x == rev (even digits) OR x == rev / 10 (odd digits, skip middle)
方法一:字串轉換比較 將整數轉為字串,再用雙指標從兩端向中間逐一比較字元是否相同。時間複雜度 O(log n)(位數),空間複雜度 O(log n)(字串長度)。雖然直觀,但違反題目「不轉換字串」的進階要求。
方法二:完整數字反轉後比較 將整數 x 完整反轉成 rev,再判斷 x == rev。缺點是當 x 接近 INT_MAX 時,rev 可能溢位。需使用 long long 儲存反轉結果,空間複雜度 O(1),時間複雜度 O(log n)。