前言
坚持刷LeetCode第二天!今天遇到的题目跟昨天的很相似,分享一下。
一、题目内容
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
例如,121 是回文,而 123 不是。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/palindrome-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、解题思路
1.反转数字
拿到题目时,就想到了昨天做过的反转数字的解法。我们可以将该数字进行反转,用反转之后的数字与开始的数字进行比较来判断是否是回文数,由于输入的数字是整数,我们也需要考虑反转之后的数字是否会存在溢出的现象,可以使用
昨天所提到的判断溢出的方法进行判断,代码如下:
if(rev > (pow(2,31)-1)/10 || rev < (-pow(2,31)/10)){
return 0;
}
另外,我们也需要注意以下比较特殊的情况:
1.当输入的数字为负数时,该数一定不为回文数。因为
−
-
−反转后在最后一位一定是无效的。
2.当输入的数字最后一位为0时,该数也一定不是回文数。因为若输入的数最后一位为0,那么反转后的数字一定比输入的数字少一位,但是当该数字为0时,它也是回文数。
判断代码如下:
if(x<0 || x%10==0 &&x !=0 )
{
return false;
}
整体代码如下:
class Solution {
public:
bool isPalindrome(int x) {
if(x<0 || x%10==0 &&x !=0 )
{
return false;
}
int rev=0;
int beg=x;
while(x != 0){
if(rev > (pow(2,31)-1)/10 || rev < (-pow(2,31)/10)){
return 0;
}
int num = x%10;
x /=10;
rev = rev *10+num;
}
if(rev == beg){
return true;
}
else{
return false;
}
}
};
2.反转一半数字
在解答完题目之后,又看了官方发布的解题思路,觉得更高效。主要是采用反转一半数字的方法,我们可以发现当 x / = 10 x /=10 x/=10时,输入的数字的最后一位则被舍去,而当 r e v = r e v ∗ 10 + n u m rev = rev *10+num rev=rev∗10+num时,输入数字的最低位则变成反转数字的最高位。
当输入的数字位数为偶数时, r e v rev rev和 x / 10 x/10 x/10相等时,我们就可以得出已经到达输入的数字位数的一半的结论;当输入的数字位数为奇数时,可以发现快达到数字位数的一半时,中间会多出一位,这时我们再将 x / 10 x/10 x/10用来舍去中间这位数字,因为位于中间的数字无论怎么反转还是相同的数字。
改变代码如下:
if(rev == x ||rev == x/10){
return true;
}
总结
今天的题目分享到此结束!明天继续!