palindrome :回文的
继回文子串之后又来回文数。
题目要求:不转换成string,来判断
题目分析:
负数非回文,0必回文,所以重点在正数
class Solution {
public:
bool isPalindrome(int x) {
if(x < 0) return false;
if(x == 0) return true;
int y = 0;
int num = 0;
int z = x;
while(z){
num = z%10;
if(y > INT_MAX/10|| (y == INT_MAX/10 && num >7)) return false;
y = y*10 +num;
z /= 10;
}
return x==y;
}
};
最初的设想,就是取余后除以10,从而获得每一位,从而反转整个数字,
再和原来的数字进行比较,如果相同就说明回文,不相同就不回文。
反转之后溢出的情况说明这个数非回文数。
升级版:
根据官方题解和评论,发现反转一半的数字就能比较是否回文。而且不仅可以避免一半的时间,还可以不用考虑溢出的情况。
当反转的数大于原数连续/10之后的结果时,就说明已经反转了一半的数字
class Solution {
public:
bool isPalindrome(int x) {
if(x < 0) return false;
if(x < 10) return true;
if(x % 10 == 0) return false;
int y = 0;
int num = 0;
while(x > y){
num = x%10;
y = y*10 +num;
x /= 10;
}
return x==y || x == y/10 ;
}
};
感觉效率也没有高多少,但是毕竟是一个思路。
需要注意的是,当输入最后一位是0时会干扰我们的判断,所以当整个数为0时才能回文。