回文数

难度: 简单

标签: 数学

给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false

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

示例 1:

输入:x = 121
输出:true

示例 2:

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

示例 3:

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

提示:

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

Submission

运行时间: 84 ms

内存: 13.7 MB

class Solution:
    def isPalindrome(self, x: int) -> bool:
        if x == 0:
            return True
        if x < 0:
            return False
        if x % 10 == 0:
            return False
        a = list()
        while True:
            a.append(x % 10)
            x = x // 10
            if x == 0:
                break
        if a[::-1] == a:
            return True
        return False
0 0

Explain

该题解的思路是先判断一些特殊情况,如果x为0则直接返回True;如果x为负数或者x的个位数为0则直接返回False。对于一般情况,创建一个列表a,通过循环取x的个位数添加到列表a中,并将x除以10。最后判断列表a和它的逆序是否相等,相等则说明x是回文数,返回True,否则返回False。

时间复杂度: O(n)

空间复杂度: O(n)

class Solution:
    def isPalindrome(self, x: int) -> bool:
        # 如果x为0,直接返回True
        if x == 0:
            return True
        # 如果x为负数或者x的个位数为0,直接返回False
        if x < 0 or x % 10 == 0:
            return False
        # 创建一个列表a,用于存储x的每一位数字
        a = list()
        while True:
            # 取x的个位数添加到列表a中
            a.append(x % 10)
            # x除以10,即去掉x的个位数
            x = x // 10
            # 如果x为0,说明已经取完所有位数,跳出循环
            if x == 0:
                break
        # 判断列表a和它的逆序是否相等,相等则说明x是回文数,返回True,否则返回False
        if a[::-1] == a:
            return True
        return False

Explore

为什么在判断`x`为负数或者`x`的个位数为0时,可以直接返回`False`?

在数学中,回文数是指正序(从左向右)和倒序(从右向左)读都是一样的数。因此,所有负数都不可能是回文数,因为负号在数的最前面,而在数的最后面不会有负号。至于个位数为0的情况,除了0本身,任何以0结尾的数都不能是回文数,因为这样的数在正序读和倒序读时最后一个数字和第一个数字不会相同(正序读时最后一个数字是0,倒序读时第一个数字是0)。因此,这两种情况都可以直接判定为非回文数,返回`False`。

为什么在判断列表`a`和它的逆序是否相等时,可以确定`x`是否为回文数?

列表`a`包含了整数`x`的所有数字,按照从最低位到最高位的顺序。当我们取`a`的逆序时,实际上是将数字序列从最高位到最低位排列。如果整数`x`是回文数,那么这两个序列应该是完全相同的。因此,通过比较列表`a`与其逆序是否相等,可以有效地判断整数`x`是否为回文数。这种方法不依赖于将整数转换为字符串,而是直接通过数值操作来完成判断。

如果不允许将整数转为字符串来解决这个问题,是否有其他方法可以判断一个整数是否为回文数?

是的,有一种方法是通过数学计算来判断一个整数是否为回文数,而不需要将整数转换为字符串。这个方法涉及到反转整数的后半部分,并与前半部分进行比较。具体步骤如下:首先检查负数和以0结尾的数。然后,使用一个变量来存储整数的后半部分的逆序。通过不断将原整数的最后一位加到逆序数的末尾,并将原整数除以10来实现这一点。当原整数小于或等于逆序数时,停止过程。最后,比较原整数与逆序数是否相等(对于偶数位的数字)或者原整数是否等于逆序数除以10(对于奇数位的数字)。这样就可以判断整数是否为回文数而无需使用字符串。

Related Problems

返回题目列表