方法一:借鉴上一题的解法(本题也涉及处理溢出的问题)
using namespace std;
class Solution {
public:
bool isPalindrome(int x) {
if (x < 0)
return false;
int output=0;
int input = x;
while (x != 0)
{
int remainder;
remainder = x % 10;
x = x / 10;
if (output > INT32_MAX / 10 || (output == INT32_MAX / 10) && remainder > 7) return false;
if (output < INT32_MIN / 10 || (output == INT32_MIN / 10) && remainder < -8)return false;
output = output * 10 + remainder;
}
if (output == input)
return true;
else return false;
}
};
方法二:官方解法,观察回文数在除以10、对10取余数时的规律。偶数位数字以1221为例,反转数12等于剩余数12;奇数位数字以12321为例,进行到反转数123时,大于剩余数12。最后返回的是判断反转数(或者除以10)是否等于剩余数。这个解法的另一个好处是处理中避免了溢出
class Solution {
public:
bool isPalindrome(int x) {
if (x < 0||(x%10==0&&x!=0))//以及除了0以外的末位数字为0的
return false;
int rev = 0;
while (x > rev)
{
int remainder;
remainder = x % 10;
x = x / 10;
rev = rev * 10 + remainder;
}
return rev == x || (rev / 10) == x;
}
};