2025/6/28
题目(难度:easy)
我的思路:
思路一:
直接转化成字符串,然后首尾以此比较就好了
代码:
class Solution:
def isPalindrome(self, x: int) -> bool:
if x < 0: return False
elif x < 10 : return True
toStr = str(x)
left, right = 0, len(toStr)-1
while left < right:
if toStr[left] != toStr[right] :
return False
left = left+1
right = right-1
return True
时间复杂度:O(n)
空间复杂度:O (n)
思路二:
不转化为字符串,通过模除切割的方式,把原数一位一位切割下来,之后再加到以此加起来得到反转后的数字。同时注意到,只反转一半的时候,就已经可以比较发现出是否为回文数,好处有①可以确保不会溢出②减少了时间复杂度
代码:
class Solution:
def isPalindrome(self, x: int) -> bool:
#提前把不可能是回文字的类型挑出来
if x<0 or (x !=0 and x%10 == 0): return False
elif x<10 : return True
reversed_num = 0
#可以进一步优化到只反转一半
while x > 0:
cut_num = x%10
reversed_num = reversed_num * 10 + cut_num
x //= 10
if reversed_num == x :
print("回文字是偶数")
return True
elif reversed_num > x:
if reversed_num//10 == x:
print("回文数是奇数")
return True
else:
print("不是回文数")
return False
时间复杂度:O(n)
空间复杂度:O(1) 【不用花费额外的空间存储字符串了】
总结:
①观察回文数为什么会是回文数
②注意python里 / 会把整数除成小数, // 才是向上取整的