[leetcode]9.Palindrome Number

题目

Determine whether an integer is a palindrome. An integer is a palindrome when it reads the same backward as forward.

Example 1:

Input: 121
Output: true
Example 2:

Input: -121
Output: false
Explanation: From left to right, it reads -121. From right to left, it becomes 121-. Therefore it is not a palindrome.
Example 3:

Input: 10
Output: false
Explanation: Reads 01 from right to left. Therefore it is not a palindrome.
Follow up:

Coud you solve it without converting the integer to a string?

解法一

思路

刚看到题,就想到Reverse Integer这道题,所以直接求reverse,然后判断x是否与reverse相等即可,此种解法int可能溢出,但是如果溢出的话,就说明该数不是回文的,直接返回false即可。

代码

class Solution {
    public boolean isPalindrome(int x) {
        if(x < 0) 
            return false;
        if(x == 0) 
            return true;
        int original = x;
        int reverse = 0;
        while(x != 0) {
            if(reverse > Integer.MAX_VALUE/10) 
                return false;
            reverse = reverse*10 + x%10;
            x /= 10;
        }
        return original == reverse;
    }
}

解法二

思路

这是一个比较精彩的解法。根据题目要求,如果x为负,直接返回false即可。另外,整数最高位是不可能为0的,所以如果一个数的最低位为0,那么它绝对不可能是回文的,这种情况下也直接返回false即可。
在逆转过程中,其实没必要全部逆转过来,我们只需要逆转后半段,然后与剩下的x对比即可。所以当x>reverse的时候,我们不断进行逆转,直到reverse>=x时,逆转结束。由于回文数的位数可奇可偶,如果是偶数的话,那么reverse就应该和x相等了;如果是奇数的话,那么最中间的数字就在reverse的最低位上了,我们除以10以后应该和x是相等的.

代码

class Solution {
    public boolean isPalindrome(int x) {
        if(x < 0 || (x>0 && x%10==0)) return false;
        int reverse = 0;
        while(x > reverse) {
            reverse = reverse*10 + x%10;
            x /= 10;
        }
        return x == reverse || x == (reverse/10);
    }
}
posted @ 2018-09-28 13:38  shinjia  阅读(110)  评论(0编辑  收藏  举报