9.回文数Java版,每日一题系列

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值