读题心路历程: 看了一遍题之后好家伙,简直一个简单啊。我的第一个思路就是,直接整数转字符串,然后reverse一下,两个一样就return true,反之就return false;
(1) 这个思路的代码:
bool isPalindrome(int x) {
string str = to_string(x);
string afstr = str;
std::reverse(str.begin(), str.end());
if (str == afstr)
{
return true;
}
else { return false; }
}
(2) 然后我看了官方题解,官方题解的思路大概就是,例如“1234”这四个数,我只需要比较后两位“34”倒过来的“43”与前两位“12”是不是一样的就行,一样的话,就证明是一个回文数了。所以关键问题就是如何找到这个数字的一半,感觉这题用了数学的方法,还挺巧妙的。具体代码如下:
bool isPalindrome(int x) {
//首先,先判断一下,x是不是是负数,或者x的个位数是不是0(这个可以用x%10来判断),然后还要排除一下x是不是0,因为如果x是0是回文数的。
if(x<0||(x%10==0&&x!=0)){
return false;
}
//判断完之后,先定义一个相反数,就是思路中,x的一半。
int reverseNum=0;
//在这里,需要判断这个相反数,什么时候到达了x的一半,就判断删数字的x和这个相反数的关系。当x不大于reverseNum了就证明,已经将x的一半给反过来了,就可以进行下一步判断了。
while(x>reverseNum){
//这里这个相反数怎么算,例如1221,就是需要求后边这个21的相反数,这个相反数就等于x先%10+reverseNum*10,当reverseNum=1之后,x=122,然后下一步的reverseNum就等于10+2就等于12了,换一个例子:"32123",reverseNum先等于3,然后x等于3212,然后下一步的reverseNum=32了,然后x=321
reverseNum = reverseNum*10+x%10;
x = x/10;
}
return x==reverseNum/10||x==reverseNum;
}