第9題 迴文數
-
解法一:數字轉化爲字符串,驗證是否是迴文
- 代碼:
class Solution: def isPalindrome(self,x:int)->bool: return (str(x)==str(x)[::-1])
- 代碼:
-
解法一進階:數字轉化爲字符串,比較字符串的前半段和後半段
- 代碼:
class Solution: def isPalindrome(self,x:int)->bool: s = str(x); l = len(s); // l表示爲字符串的長度 h = l/2; // 中間位置或者靠後一個位置 return s[:h] == s[-1:-(h+1):-1]
- 缺點:
- 需要額外的非常量空間來創建題目不允許的字符串
- 代碼:
-
解法二:數字本身反轉,判定兩者是否相等
- 存在問題:若反轉後的數字大於INT_MAX,會遇到整數溢出的問題
-
解法二進階:借鑑解法一進階————只反轉一半進行比較
- 特殊情況處理:
- 負數一定不是迴文數
- 除了0以外,個位是0的整數一定不是迴文數
- 通過不斷地循環迭代
remainder = x%10;x/=10;
進行反轉 - 循環迭代的條件是什麼?循環什麼時候終止?(反轉後的數記爲revertedNum)
- 若 x 是偶數,那麼顯然當
x == revertedNum
時,循環終止; - 若 x 是奇數,那麼顯然當
x < revertedNum
時,反轉一定過半; - 因此循環條件可設置爲
while(x <= x)
- 若 x 是偶數,那麼顯然當
- 最後一步:判斷兩者是否相等
- 若x是偶數,那麼顯然若
x == revertedNum
則可判定最初的x是迴文數; - 若x是奇數,那麼此時revertedNum必定要比x多一位,因此要通過
revertedNum/10 == x
的結果判定x是否是迴文數;
- 若x是偶數,那麼顯然若
- 我的代碼:
class Solution { public: bool isPalindrome(int x) { if(x < 0 || x>0 && x%10 == 0){ return false; } int res = 0; while(x > res){ res = res * 10 + x%10; x /= 10; } //以下部分可優化 if(x < res && res/10 == x || x == res){ return true; }else{ return false; } } };
- 優化後的官方代碼:
class Solution { public: bool isPalindrome(int x) { // 特殊情況: // 如上所述,當 x < 0 時,x 不是迴文數。 // 同樣地,如果數字的最後一位是 0,爲了使該數字爲迴文, // 則其第一位數字也應該是 0 // 只有 0 滿足這一屬性 if (x < 0 || (x % 10 == 0 && x != 0)) { return false; } int revertedNumber = 0; while (x > revertedNumber) { revertedNumber = revertedNumber * 10 + x % 10; x /= 10; } // 當數字長度爲奇數時,我們可以通過 revertedNumber/10 去除處於中位的數字。 // 例如,當輸入爲 12321 時,在 while 循環的末尾我們可以得到 x = 12,revertedNumber = 123, // 由於處於中位的數字不影響迴文(它總是與自己相等),所以我們可以簡單地將其去除。 return x == revertedNumber || x == revertedNumber / 10; } }; 作者:LeetCode-Solution 鏈接:https://leetcode-cn.com/problems/palindrome-number/solution/hui-wen-shu-by-leetcode-solution/ 來源:力扣(LeetCode) 著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
- 特殊情況處理: