(python刷题)leetcode 第9题:回文数

题目在leetcode上的链接为:
https://leetcode-cn.com/problems/palindrome-number/

题目描述
在这里插入图片描述
解题思路
这里提供两种解法:
解法一:
转换为字符串的解法
1.先判断特殊情况,即 x<0 或者 x能被10整除且x不为0这两种情况不是回文数
2.否则将整数转化为字符串,然后再判断是否为回文字符串即可。

复杂度分析:
我们令 n 表示 len(str(x)),由于需要遍历字符串的一半长度判断是否为回文字符串,所以时间复杂度为 o(n/2)=o(n)
由于需要创建字符串来存储整数转换为字符串后的每一个字符,所以空间复杂度为 o(n)

python代码:

class Solution(object):
    def isPalindrome(self, x):
        """
        :type x: int
        :rtype: bool
        """
        if x < 0 or (x % 10 == 0 and x != 0)::
            return False
        x_str= str(x)
        for i in range((len(x_str) + 1) // 2):
            if x_str[i] != x_str[len(x_str) - 1 - i]:
                return False
        return True

为了降低空间复杂度,我们想是不是不将整数转化为字符串而解题,下面来看看对应的解法二。

解法二:
如果不将整数转化为字符串,那么很容易想到的是使用数学运算直接将整数进行反转,比如对于 x=121,我们使用 x_reverse 表示 x 反转后的数字,首先初始化 x_reverse=0,循环计算 x%10 就得到了 x 末尾的数字,令 x_reverse=x_reverse*10+x%10 就得到了这一步中 x 右侧部分反转后的数,此时 x=x//10 可以得到 x 剩下的部分,依次循环直到 x=0 就实现了 x 的反转。
但是我们注意到,由于要将 x 全部反转,因此 x 反转后的数可能出现数值溢出的情况(即当 x 反转后的数字大于 INT.MAX时),为了解决这个问题,我们考虑只通过循环从 x 的末尾往前反转 x 一半的数字,如果 x 后面一半反转后的数字相等 x 前面一半的数字,那么 x 就是回文数。
那么怎么判断是否反转到 x 的一半的数字呢?我们设 a 表示 x 后面部分的数字反转之后得到的数字,刚开始 x>a,循环直到当 x<=a 时,就表示已经反转为 x 的后一半的数字,循环结束。

注意:
当 x 的数字个数为偶数时,循环结束后的判断回文数条件为 a=x。比如 x=1221,循环结束后 x=12,a=12
当 x 的数字个数为奇数时,循环结束后的判断回文数条件为 a=x//10。比如 x=121,循环结束后 x=1,a=12,此时 a的末尾的数字2是原始的 x 的中间的数字,判断时需要通过 a//10 将它去掉。
可以将两种情况进行合并,合并后的判断回文数的条件为:
a=x 或者 a=x//10

复杂度分析:
我们令 n 表示 len(str(x)),由于只需要反转一半的数字,所以时间复杂度为 o(n/2),为反转所有数字的时间复杂度的一半
由于只需要创建几个固定变量,空间复杂度为 o(1),解法二比解法一的空间复杂要低

python代码:

class Solution(object):
    def isPalindrome(self, x):
        """
        :type x: int
        :rtype: bool
        """
        if x < 0 or (x % 10 == 0 and x != 0):
            return False
        a = 0
        while x > a:
            a = a * 10 + x % 10
            x = x // 10
        return x == a or x == a // 10
发布了37 篇原创文章 · 获赞 6 · 访问量 5392

猜你喜欢

转载自blog.csdn.net/qq_37891889/article/details/104261766