LeetCode-9-回文数

LeetCode-9-回文数


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

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


示例:

示例1:

输入: 121
输出: true

示例2:

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

示例3:

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

解题思路:

Alice: 这题咱做过啊,字符串反转一下就得了,用Python写顶多三行代码。
Bob: O(∩_∩)O哈哈~
Alice: 你笑什么?
Bob: 我们受过专业的训练…进阶的那里写着不要用字符串。
Alice: 你是已经有解法了是吗?
Bob: 两种!!第一种就是直接构造一个反转后的数,然后判断两个数字是否相等。第二种就是按位比较,如果对应的位上有不相等的就不是回文数,如果都没有就是回文数。
Alice: 第一种很好写,第二中看起来挺好,但我觉得没必要,大材小用,能用简单的方法为什么要用复杂的方法呢?
Bob: (〃‘▽’〃) 因为,,万一面试的时候问你还有没有别的解法呢!!
Alice:(〃‘▽’〃) 。。。


代码:

Python方法一:转换为字符串后,反转字符串然后判别两个字符串是否相等。

class Solution:
    def isPalindrome(self, x: int) -> bool:
        originStr = str(x)
        reversedStr = "".join([z for z in str(x)][::-1])
        return originStr == reversedStr

Python方法二: 通过组合一个反转后的数字来比较两个数字是否相等。

class Solution:
    def isPalindrome(self, x: int) -> bool:
        if x < 0:
            return False
        elif x == 0:
            return True
        else:
            tmpx = x
            reversedx = 0
            while tmpx:
                reversedx = reversedx * 10 + (tmpx % 10)
                tmpx = tmpx // 10
            return x == reversedx


C++ 方法二:

class Solution {
public:
    bool isPalindrome(int x) {
        if(x < 0){
            return false;
        }else if(x == 0){
            return true;
        }else{
            long tmpx = x;
            long reversedx = 0;
            while(x){
                reversedx =  reversedx * 10 + x % 10;
                x /= 10;
            }
            return tmpx == reversedx;
        }
    }
};

Java 方法三,直接按位判断首位和末尾的数字是否相等。需要不断的去除首位和末尾的数字,代码上有点麻烦,而且会被针对很多小细节,比如说1000021这种测试样例。而且需要先整除一遍获得整个数字的位数,这样速度上也不快了,唯一的优势可能就是不用使用长整型吧。总体上不是很推荐这种解法。

class Solution {
    public boolean isPalindrome(int x) {
        if(x < 0){
            return false;
        }else if(x == 0){
            return true;
        }else{
            int pre;
            int after;
            int tmpx = x;
            int cnt = 0;
            while(tmpx != 0){
                tmpx /= 10;
                cnt ++;
            }
            //System.out.println(cnt);
            tmpx = x;
            while(x != 0){
                if(x < 10){
                    if(cnt == 1){        // 针对 100021这种中间有零的数据
                        return true;
                    }else{
                        return false;
                    }
                }
                after =  x % 10;
                pre   =  x / (int)(Math.pow(10.0, (double)(--cnt)));
                //System.out.println(tmpx +" pre " + pre + " after " + after);
                if(pre != after){
                    return false;
                }
                x /= 10;
                x -= (int)(Math.pow(10.0, (double)(--cnt))) * pre;
                //System.out.println(cnt);
            }
        }
        return true;      // 必须是true,针对 1221 这种位数是偶数的数据
    }
}

易错点:

  • Python3中整除符号是 // 而不是 /
  • 负数是没有回文数的。
  • 输入中有 2^31-1 反转后的数字使用整型存储会溢出。

总结:

  • 玉不琢,不成器。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,有三种方法可以解决LeetCode上的最长回文子串问。 方法一是使用扩展中心法优化,即从左向右遍历字符串,找到连续相同字符组成的子串作为扩展中心,然后从该中心向左右扩展,找到最长的回文子串。这个方法的时间复杂度为O(n²)。\[1\] 方法二是直接循环字符串,判断子串是否是回文子串,然后得到最长回文子串。这个方法的时间复杂度为O(n³),效率较低。\[2\] 方法三是双层for循环遍历所有子串可能,然后再对比是否反向和正向是一样的。这个方法的时间复杂度也为O(n³),效率较低。\[3\] 综上所述,方法一是解决LeetCode最长回文子串问的最优解法。 #### 引用[.reference_title] - *1* [LeetCode_5_最长回文子串](https://blog.csdn.net/qq_38975553/article/details/109222153)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Leetcode-最长回文子串](https://blog.csdn.net/duffon_ze/article/details/86691293)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [LeetCode 第5:最长回文子串(Python3解法)](https://blog.csdn.net/weixin_43490422/article/details/126479629)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值