回文数字

描述 在不使用额外的内存空间的条件下判断一个整数是否是回文。 回文指逆序和正序完全相同。

数据范围:-2^31≤n≤2^31-1 进阶: 空间复杂度 O(1),时间复杂度 O(len(n))

提示: 负整数可以是回文吗?(比如-1) 如果你在考虑将数字转化为字符串的话,请注意一下不能使用额外空间的限制 你可以将整数翻转。但是,如果你做过题目“反转数字”,你会知道将整数翻转可能会出现溢出的情况,你怎么处理这个问题?

思路:根据提示,如果是负数的时候,返回False,我之前是准备之间通过l = len(str(x))获取数字的长度,然后再用通过x除以10^l得到最高位,但是想了一下,之后每次除都要计算10的l次方,包括后来去掉前后位,可以用x = (x-高位*(10^(l-1))-个位)/10得到,我感觉这样太麻烦,时间复杂度可能会更高。还不如之间用while循环直接计算得到n=10^l。而去掉高位可以直接对n取余,之后在直接除以10取整,所以就是x=(x%n)//10,这样看着代码清爽多了,复杂度也低,因为每次循环数据都会变短两位,所以n每次要去掉两个0,即n每次要除以100。最终循环的次数也就是1.5l(刚开始循环l次,后面循环l/2次,l为数据的长度)。

# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param x int整型 
# @return bool布尔型
#
class Solution:
    def isPalindrome(self , x: int) -> bool:
        # write code here
        if x < 0:
            return False
        if x < 10:
            return True
        n = 10
        while x / n >= 10:
            n *= 10
        #n = 10^(len(str(x))-1),即;若x是两位数,则n为10;x为四位数,则n为1000
        while x > 0:
            first = x // n
            last = x % 10
            if first != last:
                return False
            x = (x % n) // 10
            n = n / 100
        return True