周报1.3

第一天:19. 删除链表的倒数第 N 个结点

第二天:2164. 对奇偶下标分别排序

第三天:144. 二叉树的前序遍历

                94. 二叉树的中序遍历

                145. 二叉树的后序遍历 

第四天: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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值