Leetcode刷题-回文数

回文数

题目一:

在这里插入图片描述
解法一:

思路:先将x转化为字符串的形式,再把它放到list中:lst = list(str(x))。定义头尾两个指针L=0,R=len(lst)-1,使头尾两个值进行比对,若相等,则左指针向右移一位,右指针向左移一位继续比对。若不等,则退出,返回False。此处不必特意判断正负,负数的第一位-与最后一位比对会返回False

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
print(isPalindrome(-123))

解法二:

思路:使用log计算x的位数。首先判断一定不是回文数的情况:负数、非零数最后一位为0。0属于回文数。用math.log(x,10)+1判断x的位数。将x的前一半数倒序存入另一个数组。

def isPalindrome(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
        reverse_x = 0
        for i in range(length // 2): # //:除法取整
            remainder = x % 10 # 取余, 即取x的最后一位数
            x = x // 10 # x去掉最后一位数
            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
print(isPalindrome(-123))

知识点:
math.log(x,y):以y为底求x的对数。y可缺省,默认为e
例:math.log(1000,10)=3。 代码中使用math.log(x,10)+1可计算出x的位数。

题目二

在这里插入图片描述
解法:

思路:首先定义链表的结点,将输入的列表(list)转化为链表,然后打印。先使用快慢指针找出链表的中点,然后把链表的后半部分存入prev中,使prev.next指向上一个结点,从而使链表后半部分翻转。反转后的后半链表prev与前半链表head的值一一比对,若都相等则是回文数。

#定义链表的结点
class ListNode:
    def __init__(self, x): #_init_:构造函数固定形式,实例化类ListNode时生效
        self.val = x
        self.next = None

#通过输入的列表来生成链表
def generateList(l: list):
    prenode = ListNode(0)
    lastnode = prenode
    for val in l:
        lastnode.next = ListNode(val) #将从l中取值到val,将val的值即赋到lastnode
        lastnode = lastnode.next
    return prenode.next #返回链表头结点(同个结点出发的.next相同)

#打印链表
def printList(l: ListNode):
    while l:
        print("%d, " % (l.val), end='')
        l = l.next
    print('')

class Solution:
    def isPalindrome(self,head:ListNode) -> bool:
        slow, fast, prev = head, head, None
        #快慢指针找链表中点:将slow结点移动至链表的n/2位,若是奇数则是n/2+1位
        while fast is not None:
            slow = slow.next
            fast = fast.next.next if fast.next is not None else fast.next
        #反转链表后半段至prev
        while slow is not None: 
  			t = slow.next #t作用:把slow后移
            slow.next = prev #使.next指向上一结点
            prev = slow # prev与slow同步移动,创建后半段的链表
            slow = t #slow后移,至None结束
        #对比链表前半段与后半段
        while head and prev:
            if head.val != prev.val:
                return False
            head = head.next
            prev = prev.next
        return True


list_a = [1, 5, 5,1]
l = generateList(list_a)  #生成链表
printList(l)
s = Solution()
print(s.isPalindrome(l))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值