[Leetcode #9]Palindrome Number 判断一个整数是否是回文数

原题地址:https://leetcode.com/problems/palindrome-number/

题目要求是:给定一个整数,判断是否是回文数。所谓回文就是正过来读和倒过来读都一样,例如12321是回文数,1221也是回文数。

另外,这个题目还有个很奇怪的要求:不能使用额外空间。个人理解这里的“额外空间”应该是指不能把整数转成成字符串,而不是说一个变量都不许用。。。(如果转成字符串再用reverse()方法一两行代码就搞定了)

一个思路是反转这个整数,然后判断和原来的数是否相等。需要处理溢出的情况,所以使用了long型保存反转结果:

public class Solution {
    public boolean isPalindrome(int x) {
        if (x < 0) return false;
        
        long reverse = 0;
        int t = x;
        while (t != 0) {
            reverse = reverse * 10 + t % 10;
            t /= 10;
        }
        
        return (reverse == (long)x);
    }
}
当然,上面的算法是可以优化减小计算量的。考虑到回文数的对称特性,可以只反转一半,然后和另外一半进行比较。这样计算量减小了一倍,也不用考虑溢出问题。

举两个例子:

如果位数为偶数,如1221,从右往左反转一半得到12,与左边一半相同,返回true

如果位数为奇数,如12321,从右往左反转一半得到123,(123 / 10)与左边一半相同,返回true

具体代码实现:(注意处理末位为0的情况)

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

你可能感兴趣的:(leetcode)