题目
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
输入: 121
输出: true
示例 2:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
进阶:
你能不将整数转为字符串来解决这个问题吗?
解1(执行时间400ms,转成字符串)
解题思路
1.将整数转换成字符串
2.分别从首尾往中间取值,判断大小(分别取一半的值即可)
class Solution:
def isPalindrome(self, x):
"""
:type x: int
:rtype: bool
"""
# 新建变量 i ,j ,保存下标
i = 0
j = 0
# 将整数转换为字符串
x = str(x)
# 取得整数的长度
Len = len(x)
# 取长度的一般作为i取值的最大值
half = Len // 2
# 循环取i
for i in range(half):
j = - 1 - i
# 取整数x的第一位
num1 = x[i]
# 取整数x的最后一位
num2 = x[j]
# 比较是否相等
if num1 != num2:
# 不相等
return False
return True
解2(执行时间388ms,不转字符串)
解题思路
- 负数肯定不是回文数,因为有负号
- 能被10整除的非0整数肯定不是回文数,因为最高位肯定不是0
- 整数除10取余可以得到最后一位的数字
- 整数除10取整数部分可以得到除最后一位的其他数字
- 整数位数有奇数和偶数之分,需要考虑到位数为奇数的情况
class Solution:
def isPalindrome(self, x):
"""
:type x: int
:rtype: bool
"""
# 判断x的正负
if x < 0:
# 如果小于0,肯定不是回文数
return False
# 判断x是否是10的倍数,如果是10的倍数,肯定不是回文数,除0以外!!!
if x % 10 ==0 and x != 0:
return False
# 新建一个值,储存回文数
y = 0
# 取整数的后一半
while x > y:
# 取x的最后一位数,赋值给y
y = y * 10 + x % 10
# 删去x的最后一位数
x = x // 10
# 判断x和y是否相等,
if x == y or x == y//10:
return True
return False
解3(最佳解,执行时间244ms,转成字符串)
解题思路
1.转成字符串
2.非负数才能使回文数
3.字符串切片[::-1]可以得到反转的字符串
class Solution:
def isPalindrome(self, x):
"""
:type x: int
:rtype: bool
"""
if x >= 0 and str(x) == str(x)[::-1]:
return True
else:
return False