[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);
}
}