[E模拟] lc9. 回文数(模拟+字符串+边界判断)

1. 题目来源

链接:lc9. 回文数

2. 题目解析

方法一:字符串

转换成字符串,倒序字符串判断相等就完事了。爽!

代码:

// 爽!
class Solution {
public:
    bool isPalindrome(int x) {
        string s = to_string(x);
        return s == string(s.rbegin(), s.rend());
    }
};
// 数学判断溢出+溢出特判
// 当且仅当整数的逆序和它本身相等,其为回文数
// 但是直接拿来逆序却会溢出,11 11 11 11 19
// 逆序为 91 11 11 11 11,就导致了整数溢出

// 其实仅需算出一半的逆序数,再判断是否和前一半相等即可
// 该方法需要考虑多个边界情况,比较麻烦,时间复杂度为O(1)
class Solution {
public:
    bool isPalindrome(int x) {
        if (x < 0 || x && x % 10 == 0) return false;
        int s = 0;
        while (s <= x) {
            s = s * 10 + x % 10;
            if (s == x || s == x / 10) return true;
            x /= 10;
        }
        return false;
    }
};

方法二:整数逆置

负数不用考虑,正数就简单的整数逆置即可。开 long long 就能简化下代码了。至于非要用 int 存的话怕是做不了,需要改做法。

代码:

// 爽!
class Solution {
public:
    bool isPalindrome(int x) {
        if (x < 0) return false;
        long long res = 0;
        int t = x;
        while (x) { res = res * 10 + x % 10; x /= 10; }
        return res == t;
    }
};

方法三:判断一半

当且仅当整数的逆序和它本身相等,其为回文数。但是直接拿来逆序却会溢出,11 11 11 11 19,逆序为 91 11 11 11 11,就导致了整数溢出。其实仅需算出一半的逆序数,再判断是否和前一半相等即可。但该方法需要考虑奇偶长度这个边界情况,比较麻烦,时间复杂度为 O ( 1 ) O(1) O(1)

注意:

  • 整数不会存在前导 0,但是逆序后可能会存在前导 0。显然是不成立的,一开始需要特判掉。即需要去除自身非零但末尾是零的元素。
  • 整数位数为奇偶两种情况时,针对一半的处理也是不一样的,这个也是注意点。

代码:

class Solution {
public:
    bool isPalindrome(int x) {
        if (x < 0 || x && x % 10 == 0) return false;
        int res = 0;
        while (res <= x) {
            res = res * 10 + x % 10;
            if (res == x || res == x / 10) return true; // 分别处理整数长度是奇数或者偶数的情况
            x /= 10;
        }
        return false;
    }
};
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ypuyu

如果帮助到你,可以请作者喝水~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值