【剑指offer题解】leetcode18,20,21

本文探讨了链表节点删除及字符串数值判断的算法实现,包括链表操作技巧与复杂字符串解析逻辑,通过实例代码展示了如何高效处理数据结构与字符串问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

18. 删除链表的节点

在这里插入图片描述
思路:数据结构基本操作,为了避免第一个节点的影响,先在开始出加一个值为空的头节点,然后就是常规的链表删除节点操作。

代码:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def deleteNode(self, head: ListNode, val: int) -> ListNode:
        dummy = ListNode(0)
        dummy.next = head
        pre = dummy
        while(pre and pre.next):
            cur = pre.next
            if cur.val == val:
                pre.next = cur.next
            pre = pre.next

        return dummy.next

20. 表示数值的字符串

在这里插入图片描述
思路:这题很无聊,我的想法就是各种逻辑的判断。设置三个flag:has_dot, has_exp, has_dig。分别表示前面的字符串出现过小数点、指数e,和数字。字符串中的合法符号有’+’, ‘-’, ‘e’, ‘E’, ‘.’, ‘0-9’,其他的符号一旦出现就返回False。对于数字0-9,需要将has_dig置为真;对于正负号,可以出现在开始位置或e后面一位,其他情况都是错的;对于小数点,如果前面出现过e(E)或者小数点,表明非法,其他情况可以继续遍历,并将has_dot标记为真;对于指数e,E,如果前面有e,E表明非法,如果前面没有数字(如 e9)也表示非法,其他情况均可以,并需要将has_exp置为真,要注意的是,这里需要把has_dig置为False,以防止e是字符串最后一位(如 9e)。

大佬给的思路中还用到了DFA,编译原理忘干净了,这里就不列举了。

代码:

class Solution:
    def isNumber(self, s: str) -> bool:
        s = s.strip()
        has_dot = False
        has_exp = False
        has_dig = False
        for i, c in enumerate(s):
            if c in ('+', '-'):
                if i > 0 and s[i-1] not in ('E', 'e'):
                    return False
            elif c == '.':
                if has_dot or has_exp:
                    return False
                has_dot = True
            elif c in ('e', 'E'):
                if has_exp or not has_dig:
                    return False
                has_exp, has_dig = True, False
            elif c.isdigit():
                has_dig = True
            else:
                return False
        return has_dig

21. 调整数组顺序奇在偶前

在这里插入图片描述
思路:双指针,类似于快排的思路。一开始两个指针指向数组最左侧和最右侧,左指针不断向后遍历,直到找到一个偶数停下;右指针不断向前遍历,直到找到第一个奇数。两个指针所指的值进行交换,并重复进行这一操作,直到左指针索引不再小于右指针索引。

代码:

class Solution:
    def exchange(self, nums: List[int]) -> List[int]:
        l, r = 0, len(nums) - 1
        while l < r:
            while l < r and nums[l]&1 == 1:
                l += 1
            while l < r and nums[r]&1 == 0:
                r -= 1
            nums[l], nums[r] = nums[r], nums[l]

        return nums
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值