学习日记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

        

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

相关推荐
●VON2 小时前
AI辅助学习如何避免依赖陷阱?
人工智能·学习
点云SLAM2 小时前
Incisive英文单词学习
人工智能·学习·英文单词学习·雅思备考·incisive·犀利的、有洞察力的·直击核心、犀利有力、分析深刻
LiYingL2 小时前
OctoThinker 通过改进 Llama 来支持强化学习,展示了中间学习的威力
人工智能·学习·llama
正经教主2 小时前
【Trae+AI】和Trae学习搭建App_2.2.2:第4章·安卓APP调用Express后端实:2:网络请求工具封装(OkHttp3)
android·学习·app·express
肥大毛2 小时前
C++入门学习---指针
开发语言·c++·学习
●VON2 小时前
AI依赖对学生学习影响的量化评估研究框架
人工智能·学习
崇山峻岭之间2 小时前
C++ Prime Plus 学习笔记039
c++·笔记·学习
QiZhang | UESTC2 小时前
学习日记day48
学习
晓梦.11 小时前
Vue3学习笔记
笔记·学习