Leetcode[数学] 9. 回文数

Leetcode[数学] 9. 回文数

审题

判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

示例 1:
输入: 121
输出: true

示例 2:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。

示例 3:
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。

进阶:
你能不将整数转为字符串来解决这个问题吗?

看到这道题,一看,字符串加双指针实现直接就可以AC了,然而为了时间复杂度和空间复杂度,我们还是要搞一下数学方法试一试

  1. 在方案一中,字符串加双指针。
  2. 在方案二中,数学方法。

代码实现

方案一:

常规操作,没啥好说的。

class Solution {
public:
    bool isPalindrome(int x) {
        int l, r;
        string s = to_string(x);
        l=0;
        r=s.length()-1;
        while ( l<r ) {
            if ( s[l] != s[r] ) return false;
            l++; r--;
        }
        return true;
    }
};

方案2:

在看了一眼官方题解后,发现这个方案一的解法不仅在时间复杂度上差了许多,并且,在空间复杂度上也没有得到足够的优化,因此,有了我们的如下解法。

  1. 首先,判断该数是否是负数或以0结尾,(这步如果不排除以0为结尾的数用不了我们的while中的计算,因为while中的计算是数字模拟字符串的比较,而如果有0出现,则无法完全模拟,例如:1210不是回文,而121是回文,这将会使两个数字都变为回文,显然,这不是正确的。)
  2. 在while循环中,我们不断削减数字的长度,利用前半段整数和后半段整数相比较。需要注意的是,这里对于偶数位数的整数没有问题,对于奇数位数的整数则要比较整除10之后的情况。
class Solution {
public:
    bool isPalindrome(int x) {
        if ( x<0 || ( x%10==0 && x!=0 ) ) return false;
        int ret=0;
        while ( x>ret ) {
            ret = ret*10 + x%10;
            x /= 10;
        }
        return ((x==ret) || (x==ret/10));
    }
};

反思

本来想用来放松的一道简单题,然而发现利用好分类讨论可以解决好多问题,这还只是数学的初级应用,爱了爱了。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值