判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
输入: 121
输出: true
示例 2:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
- show the code:
# code1:
class Solution:
def isPalindrome(self, x: int) -> bool:
if x < 0 or (x%10 == 0 and x != 0):
return False
res = 0
while x > res:
res = res*10 + x%10
x //= 10
return (x==res or x==res//10)
# code2
class Solution:
def isPalindrome(self, x: int) -> bool:
return (str(x)[::-1] == str(x))
此题首先可以用字符串的方法做,直接
[::-1]
就完事了,非常简单,但这样的话会稍微消耗一点内存,毕竟生成了新的字符串,另外题目进阶也让我们考虑不使用字符串的方法。不使用字符串的话可以考虑如何在原整数上进行操作,即翻转一半的数字,如果一个数是回文数,那么它的后半段数字翻转应该等于前半段。
如何获取后半段呢,我们可以对10取模同时整除10,比如‘12321’,我们首先得到1,然后是2,接下来将1乘以10加上2就是12,正好等于开头的数字12。
当然,我们首先需要排除一些特殊情况,负数以及能被10整除的非零数肯定不是回文数。然后我们需要考虑数字位数奇偶情况,在跳出
while
循环的步骤中,如果是偶数位,那么前半部分正好等于后半部分,如果是奇数位,由于我们将x //= 10
放在循环体后面,所以此时的前半部分x
是要比后半部分res
少一位的,比如‘12321’,此时x = 12 and res = 123
,所以需要比较x == res//10
。