leetcode的python实现 刷题笔记9:回文数 暴力解法和进阶算法

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

示例 1:

输入: 121
输出: true

示例 2:

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

示例 3:

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

进阶:

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

简单的做法只需要将int类型的数字变成字符串类型,然后翻转,比较两者是否相等,如果相等,就返回True.

class Solution(object):
    def isPalindrome(self, x):
        string = str(x)
        string1 = string[::-1]
        if string == string1:
            return True
        else:
            return False

进阶的做法,在网上看了很多的解法,发现很多人的代码只是满足三位数的数字,当不是三位数的时候,就开始报错,比如以下的程序。当执行的数字变成123321,22,这样的数字时就出现了错误。

 def isPalindrome(self, x):
        """
        :type x: int
        :rtype: bool
        """
        # 如果x是负数或者x是10的倍数,都要返回为0
        if x < 0 or (x != 0 and x % 10 == 0):
            return False
        half = 0
        # 循环找到每个位置上的数字
        while x > half:
            half = half * 10 + x % 10
            x /= 10
        return x == half or half / 10 == x

于是乎,就重新想了下这个问题,写了以下的代码

    def isPalindrome(self, x):
        """
        :type x: int
        :rtype: bool
        """
        # 如果x是负数,或者0,或者最后一位是0,都返回false
        if x < 0 or (x % 10 == 0 and x != 0):
            return False
        temp = x
        s = 0
        # 当不等于0时,执行以下循环
        while temp != 0:
            # 不断地重复此循环,然后从尾到头来一个个扩大,恢复成原来的数
            s = s * 10 + (temp % 10)
            temp = temp // 10
        # 跳出循环之后,将得到的与比较,如果相等就返回true,否则false
        return s == x

算法实现过程是这样的:

首先将得到的数字做一个判断,如果这个数字不是负数,并且这个非零的数字不是十的倍数,就执行接下来的判断。否则就输出false了。

在这里我们举个例子吧,12321。

在执行while循环的时候,不断地从后往前抛出数字,1,2,3,2,1.然后在while循环里,不断地重复扩大赋值给s。

第1圈循环,s = 1,temp = 1232

第2圈循环,s = 12,temp = 123

第3圈循环,s = 123,temp = 12

第4圈循环,s = 1232,temp = 1

第5圈循环,s = 12321,temp = 0

然后就跳出循环了。

接下来就是判断s 和 x是否相等了。在python中 == 表示的意思是疑问句,=表示的是陈述句。

s == x也就是问这两个数字是否相等?是就返回true,否则返回false

猜你喜欢

转载自blog.csdn.net/weixin_41931602/article/details/82812453