1.题目描述
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。
2.初始解法
十分垃圾:先转为数组,然后比较数字是否相同
class Solution:
def isPalindrome(self, x: int) -> bool:
flag = 1
x = str(x)
x = list(x)
length = len(x)
i = 0
while(i < length):
if(x[i] != x[length-1-i]):
flag = 0
break
i = i+1
if(flag == 1):
return True
else:
return False
算法改进:不增加空间消耗且不转换成字符串,直接用整数来进行判断。
- 首先排除负数和以0结尾的整数,肯定不是回文
- 对于12321这样一个回文,我们将之从中间切开为两个数:123和21,3位于中间先不管。然后将后面一个数字构造成12,通过对x%10和x/10这样的操作。
class Solution(object):
def isPalindrome(self, x):
if (x < 0) or (x % 10 == 0 and x != 0):
return False
reverse = 0
while(x > reverse):
reverse = reverse*10 + x % 10
x = int(x/10) #注意此处有坑,python不会整除,有小数点,需要类型转化
# 分别考虑x的位数为奇数和为偶数的情况
if (x == reverse) or (x == reverse /10):
return True
else:
return False
这个应该是在原来把整个x倒过来上改进的,只用比较一半的数字即可,时间复杂度为O(logn).
PS:感觉python不适合刷题嘤嘤嘤。