其他分享
首页 > 其他分享> > 9.回文数

9.回文数

作者:互联网

9.回文数

一、转字符串

我上来就是一个转字符串,很快啊,面试官:你回去等通知吧,下一位。

class Solution {
    public boolean isPalindrome(int x) {
        String s = String.valueOf(x);
        int left = 0;
        int right = s.length() - 1;
        while (left < right) {
            if (s.charAt(left) != s.charAt(right)) {
                return false;
            }
            left++;
            right--;
        }
        return true;
    }
}

二、数学
使用数学方法解决这个问题,也可以用反转字符串的思路,反转数字就可以了啊,比如321123,反转后是321123相等,是回文数,但是需要比较的只要一半,而且反转后可能出现整数溢出的问题,所以可以优化为反转后一半,和前一半做比较,123反转后是321,和321123前三位比较相等。
那么问题就转化为如何得到一个数字的后一半并且反转它,同时得到该数字的前一半。
首先我们处理几个边界问题,负数必然不是回文数,最后一位为0也必然不是,直接false。
众所周知,取出一个数字每一位,对10取余然后除以10就行(刚接触编程时老师就讲过的),有这个知识就很简单了,比如321123,对10取余得到3,然后除以10得到32112,假设reverse = 3,得到3,然后再对32112取余得到2,此时reverse = reverse * 10 + 2得到32,继续下去,会得到321,直到前半部分数字小于等于后半部分就结束,如何理解呢,当这个数字是偶数位时,前半和后半位数肯定相等,假如是奇数,那么取到后半多前半一位,比较的时候去掉后半部分最后一位就可以了。

class Solution {
    public boolean isPalindrome(int x) {
        if (x < 0 || (x % 10 == 0 && x != 0)) {
            return false;
        }
        int reverse = 0;
        while (x > reverse) {
            reverse = reverse * 10 + x % 10;
            x /= 10;
        }
        return x == reverse || x == reverse / 10;
    }
}

原文:https://leetcode.cn/problems/palindrome-number/solution/by-nice-hermann9a2-6lkv/

标签:10,right,return,reverse,int,反转,回文
来源: https://www.cnblogs.com/liangren-na/p/16437660.html