9. 回文数
解法:
我的解法是先判断 x 是否为负数,如果为负数,x肯定不是回文数,此外,如果0 < x < 10,x一定是回文数,其他情况将 x 翻转过来与原 x 进行比较,相等则为回文数。要注意反转后的数可能超过 int 的范围
class Solution {
public:
bool isPalindrome(int x) {
if(x < 0) return false;
if(x < 10) return true;
int temp = x;
long long reverse = 0;
while(temp > 0){
reverse = reverse * 10 + temp % 10;
temp /= 10;
}
if(x == reverse) return true;
else return false;
}
};
题解:反转一半数字
题解的思路就更优秀了,以1221为例,如果翻转后两位后与前两位相同,则为回文数,21翻转后为12,与12相同,可见1221为回文数。
在临界值的判断上,最后一位为0的数也不可能是回文数。
那么如何知道反转数字的位数已经达到原始数字位数的一半?
答:由于整个过程我们不断将原始数字 x 除以 10,然后给反转后的数字reverse 乘 10,所以,当原始数字 x 小于或等于反转后的数字 reverse 时,就意味着已经处理了一半位数的数字了。
当位数为奇数位时,如12321,经过运算后原 x =12,reverse = 123,此时则将 x 与 reverse/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 reverse = 0;
while(x > reverse){
reverse = reverse * 10 + x % 10;
x /= 10;
}
if(x == reverse || x == reverse/10) return true;
else return false;
}
};