题目描述

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

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

  • 例如,121 是回文,而 123 不是。

思路

  • 最简单的想法是将数字转换成字符串再比较;
  • 再想一想,是否可以将数字翻转然后再比较呢?
    • 这种情况可能会出现 7. 整数反转类似的溢出
    • 那我们是否可以只翻转一半数字呢?
      • 感觉可以,那怎样处理一共只有奇数位的情况呢?
      • 想一想判断条件
        • 在位数为偶数时,假设数字一共 2x 位,如果翻转一半,则会分成两个 x 位的数字 ab,其中 b 是由小变大的数字。我们可以设置 a!=b,在 b>a 时这个数字一定不是回文数;
        • 在位数为奇数时,假设数字一共 2x+1 位,在翻转一半前会有一个 x+1 位的 ax 位的 b,那下一次一定是 b>a,在此时我们可以判断 a/10 是否和 b 相等。
      • 总的来说,我们只需要
        1. 每次判断 b 和 a 是否相等;
        2. b>a 时判断 b/10a 是否相等。

最终代码:

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

想得太多

注意一些边界条件。