9.回文數Java版,每日一題系列(此題來自力扣網)

判斷一個整數是否是回文數。回文數是指正序(從左向右)和倒序(從右向左)讀起來都是一樣的整數。

示例1:

輸入: 121
輸出: true

示例2:

輸入: -121
輸出: false
解釋:從左向右讀,為-121。從右向左讀,為121-。因此它不是一個回文數。

示例3:

輸入: 10
輸出: false
解釋:從右向左讀,為01。因此它不是一個回文數。

方法一:普通解法

思路

將整數轉換為字符串,然后將字符串分割成數組,循環數組的一半長度進行判斷對應元素是否相等即可。

方法一:代碼

///簡單粗暴,看看就行
class Solution {
   public boolean isPalindrome(int x) {
       //當x小于0和尾數為0的時候直接可以false
       if (x < 0 || (x % 10 == 0 && x != 0)) {
           return false;
      }
       //x+""是將整數轉字符串,reverse()是字符串反轉
       String reversedStr = (new StringBuilder(x + "")).reverse().toString();
       //將x+""字符串和reversedStr字符串進行對比,相等返回true,不相等返回false
       return (x + "").equals(reversedStr);
  }
}

方法二:進階解法-數學解法

通過取整和取余操作獲取整數中對應的數字進行比較。

舉個例子:1221這個數字。

  • 通過計算1221/1000,得到首位1;

  • 通過計算1221%10,得到末位1;

  • 進行比較;

  • 再將百位2和十位2取出繼續比較。

方法二:代碼

class Solution {
   public boolean isPalindrome(int x) {
       //當x小于0和尾數為0的時候直接可以false
       if (x < 0 || (x % 10 == 0 && x != 0)) {
           return false;
      }
       int div = 1;
       //用while循環計算出最大的div,如1221可計算div=1000
       while (x / div >= 10) {
           div *= 10;
      }
       while (x > 0) {
           //得到最左邊的數字如left=1221/1000=1
           int left = x / div;
           //得到最右邊的數字如right=1221%10=1
           int right = x % 10;
           //進行判斷如果此時左右兩邊數不相等直接返回false
           if (left != right) {
                return false;
          }
           //然后獲取剩下的數字,1221%1000=221,221/10=22。x現在為22
           x = (x % div) / 10;
           //x縮短兩位數,所以div要除以100也縮短兩位數。
           div /= 100;
      }
       return true;
  }
}

方法三:進階解法-巧妙解法

這個方法就是取出后半段數字進行翻轉,然后在和原來前半段數字進行對比。

注意

回文數可奇可偶,如果偶數長度直接取半。如果奇數取半的同時要/10取整。

做法如下:

  • 每次進行取余操作%10,取出最低的數字:y=x%10;

  • 將最低的數字加到取出數的末尾:revertNum=revertNum*10+y;

  • 每取一個最低數字,x都要自除以10;

  • 判斷x是不是小于revertNum,當它小于的時候,說明數字已經對半或者過半了;

  • 最后,判斷奇偶情況:如果是偶數的話,revertNum和x相等;如果是奇數的話,最中間的數字就在revertNum的最低位上,將它除以10以后應該和x相等。

方法三:代碼

class Solution {
   public boolean isPalindrome(int x) {
       //當x小于0和尾數為0的時候直接可以false
       if (x < 0 || (x % 10 == 0 && x != 0)) {
           return false;
      }
       int revertedNumber = 0;
       //1.判斷x是否大于revertedNumber,假設x為12321
       while (x > revertedNumber) {
           //2.將x最后一位取出,并反轉反轉放入revertedNumber中,revertedNumber=0*10+12321%10=0+1=1
           //4.revertedNumber=1*10+1232%10=10+2=12
           //5.revertedNumber=12*10+123%10=120+3=123
           revertedNumber = revertedNumber * 10 + x % 10;
           //3.將x縮短一位x現在為1232,繼續循環判斷x是否大于revertedNumber
           //5.x=123,再次判斷
           //6.x=12,不滿足x>revertedNumber循環結束。
           x /= 10;
      }
       //因為x為奇數所以要去掉revertedNumber中的最后一位數在進行對比。
       return x == revertedNumber || x == revertedNumber / 10;
  }
}

作者:MisterBooo 鏈接:https://leetcode-cn.com/problems/palindrome-number/solution/dong-hua-hui-wen-shu-de-san-chong-jie-fa-fa-jie-ch/ 來源:力扣(LeetCode) 著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。