9.回文数(简单)

# solo
# 最初的解法,将输入数字转换为字符,进行比较
class Solution:
    def isPalindrome(self, x: int) -> bool:
        if x<0:
            return False # 首先判断数字正负,如果是负数直接返回flase,正数进行下一步的判断。
        x=str(x) # 如果是正数将该数字转为字符
        y=x[::-1]# 将字符串反转,还可以使用列表的反转,l=list(x),l.reverse()。
        for i in range(len(x)): #依次比较各个值是否相等,一旦不相等就返回FLASE,最终返回True.
            if x[i]!=y[i]:
                return False
        return True
# solo
# 不使用字符串解题思路
class Solution:
    def isPalindrome(self, x: int) -> bool:
        if x<0:
            return False  
        c=x
        a=0
        while x !=0: # 将数字进行反转
            b=x%10
            a=a*10+b
            x//=10
        if a==c: #比较两个数是否相等。
            return True
        else:
            return False
# good answer

class Solution:

    # 方法一: 将int转化成str类型: 双向队列
    # 复杂度: O(n^2) [每次pop(0)都是O(n)..比较费时]
    def isPalindrome(x: int) -> bool:
        lst = list(str(x)) #不能直接数字转换为列表,一般将数字转换为str再转变为list
        while len(lst) > 1:
            if lst.pop(0) != lst.pop(): 
"""list中的pop(默认最后一个元素)移除该值并返回,这行代码先将第一个元素移除,再移除最后一个元素进行比较,同时#删除了两个数子
"""
                return  False
        return True


    # 方法二: 将int转化成str类型: 双指针 (指针的性能一直都挺高的)
    # 复杂度: O(n)
    def isPalindrome(x: int) -> bool:
        lst = list(str(x))
        L, R = 0, len(lst)-1
        while L <= R:
            if lst[L] != lst[R]:
                return  False
            L += 1
            R -= 1
        return True


    # 方法三: 进阶:不将整数转为字符串来解决: 使用log来计算x的位数
    # 复杂度: O(n)
    def isPalindrome(self, x: int) -> bool:
        """
        模仿上面字符串的方法:分别取'第一位的数'与'第二位的数'对比
                        (弊端是:频繁计算,导致速度变慢)(下面的方法三只反转一半数字,可以提高性能)
        """
        if x < 0:
            return False
        elif x == 0:
            return True
        else:
            import math
            length = int(math.log(x, 10)) + 1
            L = length-1
            print("l = ", L)
            for i in range(length//2):
                if x // 10**L != x % 10:
                    return False
                x = (x % 10**L) //10
                L -= 2
            return True

    # 方法四: 进阶:不将整数转为字符串来解决: 使用log来计算x的位数
    # 复杂度: O(n)
    def isPalindrome(self, x: int) -> bool:
        """
        只反转后面一半的数字!!(节省一半的时间)
        """
        if x < 0 or (x!=0 and x%10==0):
            return False
        elif x == 0:
            return True
        else:
            import math
            length =int(math.log(x, 10)) + 1
        # log(x, 10 ),10是认为设置的,默认log(x)是求x的自然对数,如log(100,10)=2,所以加一才是位数
            reverse_x = 0
            for i in range(length//2):
                remainder = x % 10
                x = x // 10
                reverse_x = reverse_x * 10 + remainder
            # 当x为奇数时, 只要满足 reverse_x == x//10 即可
            if reverse_x == x or reverse_x == x//10:
                return True
            else:
                return False

    # 方法五: 进阶:不将整数转为字符串来解决: 不使用log函数
    # 复杂度: O(n)
    def isPalindrome(self, x: int) -> bool:
        """
        只反转后面一半的数字!!(节省一半的时间)
        """
        if x < 0 or (x!=0 and x%10==0):
            return False
        elif x == 0:
            return True
        else:
            reverse_x = 0
            while x > reverse_x:
                remainder = x % 10
                reverse_x = reverse_x * 10 + remainder
                x = x // 10
            # 当x为奇数时, 只要满足 reverse_x//10 == x 即可
            if reverse_x == x or reverse_x//10 == x:
                return True
            else:
                return False





x = 10
x = 10001
print(Solution().isPalindrome(x))



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值