題目簡介
今天的題目是 Palindrome Number (回文數字)。
要求我們判斷一個整數 x,是否正著讀和倒著讀一樣。
例子:
121 → true
-121 → false (因為會變成 121-)
10 → false (因為倒過來是 01)
思路
這題一看就想到兩種作法:
轉字串法
把數字轉成字串,再反轉比較。很直觀,但有點作弊感。
數學反轉法(推薦)
負數一定不是回文,直接回傳 false。
最後一位是 0(但不是 0 本身),也不可能是回文。
用數學方式把數字的「後半段」反轉出來,然後跟前半段比較。
例如 1221:
拿到最後一位 1 → 組成 rev = 1
拿到下一位 2 → 組成 rev = 12
當 rev >= x 時,停下來比較。
這樣不用處理整個數字,也不會爆 int。
程式碼 (Java)
class Solution {
public boolean isPalindrome(int x) {
// 負數或最後一位是 0(但不是 0 本身),一定不是回文
if (x < 0 || (x % 10 == 0 && x != 0)) {
return false;
}
int rev = 0;
while (x > rev) {
rev = rev * 10 + x % 10;
x /= 10;
}
// 偶數長度 → x == rev
// 奇數長度 → x == rev/10 (中間數不影響)
return (x == rev || x == rev / 10);
}
}
心得
這題算是給人暖身的 easy 題,讓人練習「數字拆解」。
我一開始直覺用字串反轉,但後來試了數學做法,發現其實邏輯滿優雅的,還能避免額外開記憶體。
我覺得這題最大的收穫就是:有些題目不一定要把數字完整反轉,只要反轉一半就足夠了。