第9題 迴文數

第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,會遇到整數溢出的問題
  • 解法二進階:借鑑解法一進階————只反轉一半進行比較

    • 特殊情況處理:
      1. 負數一定不是迴文數
      2. 除了0以外,個位是0的整數一定不是迴文數
    • 通過不斷地循環迭代remainder = x%10;x/=10;進行反轉
    • 循環迭代的條件是什麼?循環什麼時候終止?(反轉後的數記爲revertedNum)
      1. 若 x 是偶數,那麼顯然當x == revertedNum時,循環終止;
      2. 若 x 是奇數,那麼顯然當x < revertedNum時,反轉一定過半;
        12321
        1232
        123
        12
        0
        1
        12
        123
      3. 因此循環條件可設置爲while(x <= x)
    • 最後一步:判斷兩者是否相等
      1. 若x是偶數,那麼顯然若x == revertedNum則可判定最初的x是迴文數;
      2. 若x是奇數,那麼此時revertedNum必定要比x多一位,因此要通過revertedNum/10 == 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)
      著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
      
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章