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