题目

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

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

示例1

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

示例2

  1. 输入: 121
  2. 输出: true

实现

思路1 字符串

最容易想到的思路就是数字转字符串,再将字符串翻转。不过这个方法也可以优化一下,及将字符串的上半部分跟字符串的下半部分进行对比,这是一开始没想到的做法,这里放一下该方法的代码:

  1. def isPalindrome(self, x)
  2. s = str(x)
  3. l = len(s)
  4. h = l // 2
  5. return s[:h] == s[-1: -h-1: -1]

思路2 数字翻转

数字翻转也容易想到,但是假设x=2112342378,翻转后的x会发生溢出。因此这里也是借鉴上面的思路,只将数字的后半部分代码进行翻转,最后跟前半部分进行对比。
这里要注意循环结束的条件,因为

  • 当x为偶数时,例如1221,将右半部分翻转后为12,x剩下12,此时循环可以终止了,终止条件为9. 回文数 - 图1
  • 而当x为奇数时,例如12321,右半部分翻转后为12,x剩下123。所以这里我们再循环一次,使右半部分为123,x剩下12,在最后对比的时候让 9. 回文数 - 图2。则此时循环终止条件为9. 回文数 - 图3
  • 所以综合上述,循环终止条件为9. 回文数 - 图4
  1. class Solution(object):
  2. def isPalindrome(self, x):
  3. """
  4. :type x: int
  5. :rtype: bool
  6. """
  7. if x<0 or (x % 10 == 0 and x != 0):
  8. return False
  9. right_rev = 0
  10. while x > right_rev:
  11. right_rev = right_rev*10 + x % 10
  12. x = x // 10
  13. return x == right_rev or x ==right_rev // 10