第二天:2164. 对奇偶下标分别排序
第三天:144. 二叉树的前序遍历
第四天:6004. 得到 0 的操作数
(周赛第一题)
1.收获:当利用双指针时,快指针先行n步,在快指针遍历完时,慢指针刚好到倒数第n个结点,且想要返回慢指针遍历的结果时,应该返回他所指向的链表,并不是返回slow.next,此时slow.next为空(最后慢指针也会遍历完整个链表,最后一次指向的NULL)
class Solution:
def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
dummy_head = ListNode(0) #设置傻瓜头结点应对删除头结点情况
dummy_head.next = head
slow, fast = dummy_head, head
for i in range(n): #fast先行n步
fast = fast.next
while fast: #当fast遍历整个链表,slow刚好到倒数第n个结点,让slow.next指向slow.next.next即可删除该节点
fast = fast.next
slow = slow.next
slow.next = slow.next.next
return dummy_head.next #不返回slow.next是因为这时候slow.next为空,而dummy_head.next正好时整个slow遍历的链表
2.list,从左往右是0到n-1或者-n到-1,切片用法
切片操作基本表达式:object[start_index:end_index:step]
step为正,从左往右取值,为负从右往左取值。ps:在使用切片时属于浅拷贝,没有单独开辟内存空间(切片详解:彻底搞懂Python切片操作 - 简书)
class Solution:
def sortEvenOdd(self, nums: List[int]) -> List[int]:
nums[::2] = sorted(nums[::2]) #偶数位用切片排序,奇数位用切片排序且反转
nums[1::2] = sorted(nums[1::2], reverse = True) #sorted()中reverse=true降序,reverse=false升序
return nums
3.前序,中序,后续遍历的次序依次为,根左右,左根由,左右根。要完整遍历左右子树,用递归的方式比较合适,合理调节访问左子树,访问右子树,记录结点值的顺序。且要调用一次dfs(root)才能正在使dfs函数在二叉树中使用
前序:
class Solution:
def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
def dfs(cur):
if not cur: return []
res.append(cur.val)
dfs(cur.left)
dfs(cur.right)
res = []
dfs(root)
return res
中序:
class Solution:
def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
def dfs(cur):
if not cur: return
dfs(cur.left)
res.append(cur.val)
dfs(cur.right)
res = []
dfs(root)
return res
后序:
class Solution:
def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
def dfs(cur):
if not cur: return
dfs(cur.left)
dfs(cur.right)
ans.append(cur.val)
ans = []
dfs(root)
return ans
4.在两个条件的循环中,两个循环条件是每次是其中一个变换的,在跳出循环时,只需要其中一个等于0即可,所以在循环条件时!=时,要用and,而不是or
class Solution:
def countOperations(self, num1: int, num2: int) -> int:
count = 0
while num1 and num2: #这里要有and,因为当其中一个为0时已经跳出了循环,另外一个可能永远不为0
if num1 >= num2:
num1 -= num2
else: num2 -= num1
count += 1
return count