新手小白LeetCode刷题——判断回文数(二)

新手小白LeetCode刷题——判断回文数(二)


前言

坚持刷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=rev10+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;
}

总结

今天的题目分享到此结束!明天继续!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值