[更文刷题] 9. 回文数

73 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情

一、题目描述:

9. 回文数 - 力扣(LeetCode) (leetcode-cn.com)

给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。

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

例如,121 是回文,而 123 不是。

示例 1:

输入: x = 121
输出: true

示例 2:

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

示例 3:

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

提示:

  • -2^31 <= x <= 2^31 - 1

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

二、思路分析:

方法一:将整数类型转化为字符串 t ,然后反转 t 得到 t2, 比较 t2 == t

class Solution {
public:
    bool isPalindrome(int x) {
        //当 x 为负数时,由于负号的存在,因此一定不是回文
        if( x < 0)
            return false;
        
        string compare = to_string( x);
        reverse( compare.begin(), compare.end());
        return to_string(x) == compare;
    }
};

方法二:由于转化字符串耗时且耗空间,我们寻找一个不需要转化为字符串的方法。

关键点:对于整数类型,如果该整数是回文数,这意味着这个整数即使反转也不会溢出。

有了上述要点,我们可以设置变量 compare, 它存储原数字反转后的数字,然后将二者比较即可。

class Solution {
public:
    bool isPalindrome(int x) {
        //当 x 为负数时,由于负号的存在,因此一定不是回文
        if( x < 0)
            return false;
        
        long compare = 0;
        int temp = x;
        while( temp)
            compare = compare * 10 + temp % 10, temp /= 10;
        
        return compare == x;
    }
};

方法三:翻转一半数字,然后比较翻转后的数字和剩下的数字是否相等。

class Solution {
public:
    bool isPalindrome(int x) {
        //当 x 为负数时,由于负号的存在,因此一定不是回文
        //当 x 不为 0, 且最后一位为0, 则一定不是回文
        if( x < 0 ||( x!= 0 && x%10 == 0))
            return false;
        int compare = 0;
        while( x > compare)
            compare = compare * 10 + x % 10, x/=10;
        
        return (compare == x) || (compare / 10 == x);     //compare/10 是考虑了奇数位数的情况
    }
};

范文参考:

9. 回文数 - 回文数 - 力扣(LeetCode)