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) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。