学习日记day47

Day47_1210

专注时间:6H21min,学的这么狠,不错!

每日任务:1h=二刷2道力扣hot100(如果是hard,只做一道就好 完成情况及时长: );【学习资源:PyTorch官方文档:https://docs.pytorch.ac.cn/tutorials/beginner/basics/intro.html】1.5h=PyTorch工程实操(完成情况及时长: 40 );1h=周志华机器学习(完成情况及时长: 0 );【按照Claude的路线】1h=手撕机器学习算法(完成情况及时长: ?? );计算机网络45分钟(完成情况及时长: ??

学完机器学习,然后是深度学习、搜广推经典模型(也有很多要手撕的,见Claude生成的)。学完PyTorch,之后是Transformer与大模型架构(见Gemini3pro生成的阶段2)。学快一点,学完还要做搜广推的实战项目。准备一个GitHub Repo把所有手撕过的算法整理进去,这会是最好的复习资料。

必须熟记的API、最简洁的GPT实现、带注释的Transformer实现、推荐系统模型库(包含主流模型实现)还有"Let's build GPT"系列学习视频见Claude的第20页。

学习内容: 如上

总结与心得: 以后hard二刷只做一道,太难了,这道我做了2H32min。早上睡醒不要刷抖音玩手机,戴上耳机点好歌就去洗漱出发图书馆。

《25.K个一组翻转链表》

一旦要思考的很多,就不知道怎么下手,代码也失去了逻辑,试着学习豆包把核心思路列举出来。本题目为字节高频考题。

关于 dummy.next指向第一组反转后的头结点是怎么实现的:这样来想,把dummyhead也当做是前一组节点就好了。

python 复制代码
# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution(object):
    def reverseKGroup(self, head, k):
        """
        :type head: Optional[ListNode]
        :type k: int
        :rtype: Optional[ListNode]
        """
        #你的代码核心问题在于计数逻辑错误、翻转范围失控、组间连接断裂、空指针未处理,最终导致链表结构混乱,返回值也不对。下面先拆解错误,再给出正确思路和代码。
        #不通过时候,再读题目,发现不符合:剩余节点不足K个时候,不处理
        #难点:翻转后要正确连接各组(前一组的尾 → 当前组翻转后的头,当前组翻转后的尾 → 下一组的头)
        #一次遍历:fast(初始化head)节点与cnt来统计节点数量。当cnt==k,开始翻转,翻转完成后fast移动一位,pre = cur,cur = fast 
        #没有先检查「剩余节点是否够 k 个」,直接翻转,导致不足 k 个的节点也被错误翻转。
        #就没想到3组之间的连接

        #整理一下思路:
            #1.用dummyhead处理头结点翻转的边界情况
            #2. 用pre指向当前组的前一个节点(初始为dummyhead),end指向当前组的最后一个节点(初始为pre)
            #3.每次先检查从end开始是否有K个节点,不足则直接返回结果
            #4.翻转当前组的链表,连接【前一组--->当前组->下一组】
            #5.更新pre和end进入下一组循环
        # 没想到:哑节点用于固定新链表的头(解决返回值错误)
        dummyhead = ListNode(0)
        dummyhead.next = head
        pre,end,cur = dummyhead,dummyhead,head
        #当下一个节点非空(还有节点)时候进入循环
        while end.next:
            #这个for比while好用
            for _ in range(k):
                end = end.next
                if not end:# 不足k个,直接返回结果(剩余节点不处理)
                    return dummyhead.next
            # 4. 记录关键节点(解决组间连接断裂):
            next_group = end.next # 下一组的起始节点(翻转前先记下来)
            start = cur # 当前组的起始节点(翻转后会变成组尾)

            # 5. 你的翻转逻辑改造:翻转当前组的k个节点
            # 重置翻转用的pre_node(避免和外层pre混淆)
            pre_node = None
            tmp_cur = start # 临时cur,避免修改原cur的指向。这里如果有点晕,就去写一个翻转链表函数来调用
            # 翻转k个节点(替代你原有的while cnt==k,解决翻转范围失控)
            #注意这里不是while,不然会死循环,翻转K各一组就够了 所以用for
            for _ in range(k):
                tmp = tmp_cur.next
                tmp_cur.next = pre_node
                pre_node = tmp_cur
                tmp_cur = tmp
            # 6. 组间连接(核心!解决链表断裂):
            start.next = next_group# 前一组的尾 → 当前组翻转后的头
            pre.next = pre_node# 当前组翻转后的尾 → 下一组的头

            #更新变量,进入下一组;pre cur end 这里要画图才能懂
            pre = start
            end = start #或者end = pre
            cur = next_group
            

        #你最后 return pre,但 pre 只是最后一次翻转的临时头节点,没有利用 dummyhead 保存整个链表的头,导致返回的链表不完整。
        return dummyhead.next
            

                

            
        
python 复制代码
# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution(object):
    #第一次遇到这种函数写法,记一下
    #翻转一个子链表,并且返回新的 头 与 尾
    def reverse(self,head,tail):
        pre = tail.next
        p = head
        #这个写法第一次见
        while pre != tail:
            nex = p.next
            p.next = pre
            pre = p
            p = nex
        #返回新的头与尾
            #返回尾部(也就是新的头),返回头部(也就是新的尾)
        return tail,head

    def reverseKGroup(self, head, k):
        """
        :type head: Optional[ListNode]
        :type k: int
        :rtype: Optional[ListNode]
        """
        #写官方解法
        dummyhead = ListNode(0)
        dummyhead.next = head
        pre = dummyhead

        while head:
            tail = pre
            for _ in range(k):
                tail = tail.next
                if not tail:
                    return dummyhead.next
            nex = tail.next
            head,tail = self.reverse(head,tail)

            tail.next = nex
            pre.next = head

            pre = tail
            head = nex 
        return dummyhead.next

        

"翻转一个子链表,并且返回新的 头 与 尾" 这种函数第一次见,积累一下。

相关推荐
西岸行者4 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意4 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码4 天前
嵌入式学习路线
学习
毛小茛4 天前
计算机系统概论——校验码
学习
babe小鑫4 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms4 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下4 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。4 天前
2026.2.25监控学习
学习
im_AMBER4 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J4 天前
从“Hello World“ 开始 C++
c语言·c++·学习