LeetCode:回文数(Python版本)

LeetCode刷题日记

  • 回文数
    • Python代码
      • 进阶
        • Python代码

回文数

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/

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

示例 1:

输入: 121
输出: true

示例 2:

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

示例 3:

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

进阶:

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

Python代码

class Solution(object):
    def isPalindrome(self, x):
        """
        :type x: int
        :rtype: bool
        """
        string = str(x)  # 数字转换为字符串
        if len(string) == 1:  # 一个数字肯定是回文数
            return True
        for i in range(len(string)):
            if string == string[::-1]:  # 判断是否为回文
                continue
            else:
                return False
        return True

LeetCode近期更新了,更方便地查看提交记录和执行用时,内存消耗,这个功能挺不错的。

执行用时 : 128 ms, 在Palindrome Number的Python提交中击败了100.00% 的用户
内存消耗 : 11.7 MB, 在Palindrome Number的Python提交中击败了0.25% 的用户

典型的用时间来换空间了。

进阶

本来想着看看有没有更好的算法,点开了题解,发现题解就是这个进阶方法。。

就直接把题解的方法改成了Python

思路是这样的:

输入 1221,我们可以将数字“1221”的后半部分从“21”反转为“12”,并将其与前半部分“12”进行比较,因为二者相同,我们得知数字 1221 是回文

1.思路是这样的很清晰,但是发现有一些情况比较特殊没法处理,例如输入x = 10,那么前半部分和后半部分是10,用1做地板除时候就会发现出现0 == 0的情况了,不是预想的1 != 0那么就要排除临界情况,10, 20, 30...等等。

2.但是要考虑到输入为类似12321的情况了,这样会出现123 != 12,那么很好办,就把123做一次地板除就好啦。

No BB show code:

Python代码

class Solution(object):
    def isPalindrome(self, x):
        """
        :type x: int
        :rtype: bool
        """
        revertNum = 0
        if x < 0 or (x % 10 == 0 and x != 0):  # 排除临界情况
            return False
        while revertNum < x // 10:  # 比较两个数字的大小
            revertNum = revertNum * 10 + (x - x // 10 * 10)

            x = x // 10
        if revertNum == x or revertNum == x // 10:  # 包含了类似12321这种情况
            return True
        return False

执行用时 : 172 ms, 在Palindrome Number的Python提交中击败了78.68% 的用户
内存消耗 : 11.8 MB, 在Palindrome Number的Python提交中击败了0.25% 的用户

嗯。。占用内存还挺大的。。。

你可能感兴趣的:(Python)