判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
输入: 121 输出: true 示例 2:
输入: -121 输出: false 解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。 示例
3:输入: 10 输出: false 解释: 从右向左读, 为 01 。因此它不是一个回文数。
1[自a] 每位都取出来 —— 由于2个并列循环,速度只超越了10%
def isPalindrome(x):
"""
:type x: int
:rtype: bool
"""
'''负数有负号 一定不是回文'''
if x < 0:
return False
'''拆成单个数字'''
count = 0 # 位数
list = []
while x // 10:
list.append(x % 10)
count += 1
x //= 10
list.append(x % 10)
count += 1
'''位数奇偶可通过 位数//2统一化处理'''
for i in range(count//2):
if list[i] != list[count-i-1]:
return False
return True # 妙:单个数字 1//2=0 自动漏下来True
2 左右半拉 直接比整个数 —— 只有一个循环,速度超越80%
【特例】
最后一位是0就一定不行,无论前面是0还是1~9
需要筛掉最后一位为0的,因为第一位不可能为0
100 1000 倒数23位是0 当然更不行了!!
def isPalindrome(x):
"""
:type x: int
:rtype: bool
"""
'''负数都不符合'''
if x < 0:
return False
'''
最后一位是0就一定不行,无论前面是0还是1~9
'''
if x%10 == 0 and x!=0:
return False
'''左半拉 和 右半拉 比较回文'''
y = 0 # 右半拉的反转数字
while x // 10:
y = y * 10 + x % 10
x //= 10
if x / 10 < y * 10: # 达到一半的位数中止
break
'''比较 左右半拉的数'''
if x == y or x // 10 == y: # 奇偶只能这么用"或"来判断
return True
return False