#LeetCode刷题#,#回文数#

LeetCode刷题第三题,回文数

题目描述

判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。示例:
输入:121, 输出:True
输入:-121,输出:False,理由:121-不是-121的回文数
输入:10, 输出:False, 理由:01不是10的回文数
进阶要求:你能不将整数转为字符串来解决这个问题吗?

解法一:字符串逆序输出

将数字转化为字符串形式,排除数字”0“和负数的干扰,对正整数进行字符串转化后逆序输出,判读是否是回文数。代码如下:

class Solution:
    def isPalindrome(self, x: int) -> bool:
        a=x
        if a==0: # 若输入为0,为回文数
            return True
        str_a=str(a)
        a = ''
        if str_a[0]=='-': # 若输入为负数,则不是回文数
            return False
        a += str_a[len(str_a)-1::-1].lstrip("0") # 对于正整数,先将其逆序,再与原数对比
        a = int(a)
        if a==x:
            return True
        else:
            return False

执行通过,运行时间为92ms。

进阶解法:反转一半数

思路,参考:

https://leetcode-cn.com/problems/palindrome-number/solution/chao-xiang-xi-tu-jie-san-chong-jie-fa-9-hui-wen-sh/

#LeetCode刷题#,#回文数#_第1张图片
我们不用反转整数的所有数字,只需要反转一半数字就可以了,这是利用了【回文】的对称性。
反转一半数字的代码跟解法二类似,但是循环终止条件不一样,解法二中的循环终止条件是x>0,我们不断的做x/10操作,最终x就会等于0,于是退出循环。但反转一半数字的循环条件就不好写了。
根据数字的长度判来判断循环的次数,这是可以的,但是怎么确定数字的长度呢?
仔细看上面的图,对于奇数长度的回文数字12321,我们可以拆分成两个数12和123。
对于偶数长度的回文数字123321,我们可以拆分成两个数字123和123。

那现在就明朗了,我们可以用大于来判断。在循环内原数字不断迭代 处理后如果大于新数字​循环就退出。
代码如下:

class Solution:
    def isPalindrome(self, x: int) -> bool:
        if x<0 or (x%10==0 and x!=0):
            return False
        ans = 0
        while x>ans:
            ans = ans*10 + x%10
            x //= 10
        return x==ans or x==(ans//10)

执行通过,运行时间为:108ms

你可能感兴趣的:(算法,leetcode,python)