【力扣】回文数,反转一半数字+字符串

回文数原题地址

方法一:反转一半数字

考虑特殊情况:

  1. 负数不是回文数,如-123,反过来为321-。
  2. 个位数为0的非0数不是回文数,比如120,反过来为021。

对于一般情况,我们只需要取出后半段反转再跟前半段比较即可。如:

  1. 12321,后半段321反转为123,前半段12,是回文数。
  2. 1221,后半段21反转为12,前半段12,是回文数。
  3. 12324,后半段324反转为423,前半段12,不是回文数。
  4. 1223,后半段23反转为32,前半段12,不是回文数。

为什么不是直接反转整体呢?因为反转后的数据有可能超出INT_MAX,导致溢出

注意到整数操作的3个技巧:

  1. xmod10可以取出x的最低位。如x=123,xmod10=3。
  2. x=x*10+y,0\leqslant y\leqslant 9,可以在x后面续上y。如x=123,y=4,那么经过这个操作后x=1234。
  3. x/=10可以去掉x的最低位。如x=123,x/=10,x=12。

如何反转呢?取r=0,每次用技巧1取出x的最低位,再用技巧2续到r上,最后用技巧3去掉x的最低位。如:

  1. x=12321,r=0→x=1232,r=1→x=123,r=12→x=12,r=123。
  2. x=1221,r=0→x=122,r=1→x=12,r=12。

什么时候才处理完一半的位数呢?显然,r的位数越来越大,x的位数越来越小,当r的位数≥x的位数时,即r≥x时就处理完了。偶数位的回文数处理到最后满足x==r(参考一般情况的案例1),奇数位的回文数处理到最后满足x==r/10(参考一般情况的案例2)。如果不满足x==r或x==r/10,则不是回文数。

// 方法一:反转一半数字
class Solution {
public:
    bool isPalindrome(int x) {
        // 负数、个位数为0的非0数
        if (x < 0 || (x % 10 == 0 && x != 0))
            return false;

        // 反转后半段
        // r越来越大,x越来越小
        // 当r的位数比x大(或相等)则处理完一半的位数
        int r = 0;
        while (r < x)
        {
            r = r * 10 + x % 10;
            x /= 10;
        }

        //     偶数位      奇数位
        return r == x || r / 10 == x;
    }
};

方法二:字符串

我们也可以先把整数转换为字符串,再判断字符串是否为回文串

整数转换为字符串可以使用整数处理技巧2和3,每次取出最低位插入到字符串中,这样转换出来的字符串和原来的整数是反过来的,如123转换为字符串后就变成了"321",但是是否回文的性质不变。

判断回文串的思路是:取2个指针指向最左边和最右边的字符,从2边向中间移动,判断沿途的字符是否相同,如果都相同就是回文串

// 方法二:字符串
class Solution {
public:
    bool isPalindrome(int x) {
        // 负数和个位数为0的非0数
        if (x < 0 || (x % 10 == 0 && x != 0))
            return false;

        //string s = to_string(x);
        // 取出每一位插入,这样的字符串是反的
        string s;
        while (x)
        {
            s += (x % 10 + '0');
            x /= 10;
        }

        // 判断s是否为回文串
        int left = 0;
        int right = s.size() - 1;
        while (left < right)
        {
            if (s[left] != s[right])
                return false;

            ++left;
            --right;
        }

        return true;
    }
};

相关推荐

  1. 数据结构与算法】 344. 字符串

    2024-02-05 22:02:01       21 阅读
  2. 344-字符串

    2024-02-05 22:02:01       30 阅读
  3. -344. 字符串

    2024-02-05 22:02:01       24 阅读
  4. :541. 字符串 II

    2024-02-05 22:02:01       12 阅读
  5. 每日题 --- 字符串中的单词[][Go]

    2024-02-05 22:02:01       22 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-05 22:02:01       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-05 22:02:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-05 22:02:01       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-05 22:02:01       20 阅读

热门阅读

  1. P1022 [NOIP2000 普及组] 计算器的改良

    2024-02-05 22:02:01       37 阅读
  2. AtCoder Beginner Contest 339 B.Langton‘s Takahashi【模拟】

    2024-02-05 22:02:01       39 阅读
  3. C语言中递归算法的效率分析

    2024-02-05 22:02:01       30 阅读
  4. termux安装openssh+nginx

    2024-02-05 22:02:01       35 阅读
  5. python实例100第51例:学习使用按位与 & 。

    2024-02-05 22:02:01       29 阅读
  6. 6-5 E. DS树--二叉树高度

    2024-02-05 22:02:01       35 阅读
  7. 设计模式(结构型模式)外观模式

    2024-02-05 22:02:01       29 阅读
  8. 牛客网 AB2.栈的压入、弹出序列

    2024-02-05 22:02:01       37 阅读
  9. 从头开始学python(python基础)

    2024-02-05 22:02:01       32 阅读