复杂链表复制详解:三种解法与深拷贝实现
1. 题目拆解这道题为什么值得写进“必刷清单”1.1 先说清楚复杂链表到底是个什么结构这道题全名叫“剑指 Offer 35. 复杂链表的复制”在LeetCode上编号对应。第一次看到“复杂链表”四个字很多人会以为它是指多重循环嵌套或者结构很绕的链表其实不是。这里说的“复杂”有明确含义链表的每个节点除了有一个指向下一个节点的指针还额外多了一个random指针——它可以指向链表中的任意一个节点也可以指向null空。拿生活里的场景打比方普通链表像一条串好的珍珠项链每颗珠子只管连接下一颗复杂链表则像一本带批注的书籍每一页除了写着本页正文还夹着一张便签便签上记着“相关内容请翻到第168页”这样的提示。random指针就是那张便签它不是顺着页码顺序来的可能指向前方可能指向后方也可能干脆什么都没有。实际定义里复制后的链表必须构成一个全新的、独立的链表新链表和原链表的结构完全一致每个新节点的next顺序和原链表相同每个新节点的random指向的新节点必须对应原节点random所指节点的复制版本。也就是说这是一个“深拷贝”问题——不是把原链表的引用拿过来用而是从零构建一个结构相同、数据相同、但内存地址完全独立的链表。1.2 复制一个带random指针的链表难点到底在哪里理解了定义你会发现这道题最难的地方不在编程语言而在于“随机指针的对应关系”。如果只是顺着遍历一遍依次创建新节点、连好next做起来很快三分钟写完。问题是当你创建到某个新节点想给它设置random指针时会发现“这个random到底指向谁”是个悬而未决的问题——因为原节点random指向的那个目标节点对应的新节点此刻可能还没创建出来。打个比方你要搬一栋楼里的人到一个新小区每个人在新小区都有一个新门牌号。老楼的住户名单上写着“A的邻居是B”但此刻B的新家还没准备好你就没法直接把A新家的邻居位置填上去。要么你提前把所有人的新家都建好要么你先记住老楼里的对应关系之后再挨个补上。这个“先记录、后链接”的过程正是这道题的核心。新手最常犯的错是直接把原链表节点的random赋值给新节点。表面上看起来似乎“复制”了但实际上新链表和原链表共享了random指向的节点。一旦原链表释放或修改新链表也跟着坏掉更关键的是这等于新链表的random根本没有指向对应的新节点——面试官在验证时会用“判断两个链表物理地址是否独立”的方式当场拆穿。1.3 这道题考察的能力项是什么从面试评价维度来看这道题考察的东西很立体首先是链表基本功——能否正确处理指针的增删改其次是空间换时间的思想——能否想到用一个哈希表建立原节点到新节点的映射把“对应关系”显式存下来第三是创造力——能否在不使用额外存储的前提下用“复制节点插入原链表再拆开”的方式把问题解掉第四是边界意识——空链表、只有一个节点、random指回自身、random指向后面的节点这些情况是否都考虑到了。很多面试者会说“这题我会”但实际手写时暴露出各种问题要么忘了处理空链表要么在拆分环节把原链表结构改乱了要么节点指向关系写错。这些问题恰好反映出平时写代码是否严谨、是否真正理解了指针的语义。这也是它为什么高频出现在大厂笔试和面试题库中的根本原因——它不是考背诵而是考你有没有“结构化思维”。1.4 从题目往真实工程场景拉一拉光说面试不够这道题在真实工程里的影子也很多。凡是需要“深拷贝带随机引用关系的数据结构”的地方都是这个模型。比如前端框架里深拷贝一个带ref引用的虚拟节点树、图形编辑器里复制一个带图层关联关系的画布、分布式系统快照备份时复制带随机依赖的任务图甚至某些编译器实现里复制带自由变量的抽象语法树——底层都会遇到和“复杂链表复制”一模一样的问题。面试时如果能主动提一句“这个题本质上就是带随机引用的深拷贝问题类似场景在XX系统里有应用”会很加分。因为面试官知道你不只是在刷题而是真的在建立题目和工程之间的连接。2. 三种解法选型与核心思路解析2.1 哈希表解法最直觉、最稳妥的“空间换时间”哈希表解法的核心思路一句话就能概括建立原节点到新节点的映射表一切对应关系都通过这个映射表结算。具体分两步做第一遍遍历原链表只创建新节点用哈希表记录(原节点 → 新节点)的映射关系。此时新链表里每个节点都建好了但它们之间的next和random都还没有连。第二遍遍历原链表对每个原节点通过哈希表取出它的新节点再通过哈希表把新节点的next和random分别指向(原节点.next)对应的新节点、(原节点.random)对应的新节点。这个解法最大的优点是思维负担小只要维护好一张映射表其他都顺理成章。它的时间复杂度是O(n)空间复杂度是O(n)属于标准的“空间换时间”策略。实际写代码时要注意一个细节第二步给新节点设置next和random时有的人会用if cur.random ! null做判断再赋值。其实不需要——如果random本来就是null用哈希表查null会得到一个null结果直接赋值就行了。当然前提是你没有在查表前对cur.random做任何“解引用”操作否则空指针异常就在前方等着你。我在给新人讲这个解法时常用一个类比这就像搬家用了一本“旧家具 → 新家具”的对照清单。先照着旧清单把所有新家具买齐摆进新家再对着老房子挨个查看“这组沙发的对面是哪件家具”查出名字后翻对照清单找到新家具的位置照样子放好。2.2 拼接拆分解法不占额外空间的“原地加工法”如果面试官在哈希表解法之后追问一句“能不能把空间复杂度降到O(1)”你就要掏出这个解法了。思路也很巧妙把新节点直接插到原节点后面让新旧链表呈一个“交错串”的形式之后再分离。三个步骤遍历原链表在每个原节点cur后面创建新节点copy并让copy.next cur.next、cur.next copy。整个过程只改链接不涉及哈希表。再遍历一遍链表处理random指针原节点cur的next是copy那么copy.random cur.random.next。因为cur.random在原链表里指向某个节点而那个节点后面一定紧跟它的新节点所以cur.random.next就是对应的新节点。拆分链表把交错链表中原节点和新节点分开恢复原链表的next结构同时把新链表的next逐一连好。我第一次看到这个解法时愣了一下它利用了“新旧节点紧挨着”这一物理位置关系省掉了哈希表。本质上是用“位置”来替代“映射”属于典型的用结构换空间的思路。时间复杂度仍然是O(n)额外空间是O(1)——当然新链表本身占用的空间不算“额外”那是返回值必需的。这个解法虽然省空间但写起来细节更多尤其是第三步拆链的过程。常见的错误是在遍历时直接把cur.next改成cur.next.next导致还没走到新节点就把它的下一个连接丢了。拆链的正确姿势是维护一个原链表指针cur每步让原节点的next跳到原链表的下一个原节点同时让新节点的next跳到新链表的下一个新节点两个指针同步前进。2.3 回溯哈希表解法递归视角下的“按需构建”第三种解法是一种更巧妙的递归实现思想可以概括为“备忘递归”或“动态规划式的深拷贝”。核心逻辑是写一个函数copyRandomList(head)负责返回head节点的深拷贝副本。在这个函数里先用哈希表记录“原节点→新节点”的映射如果当前节点已经复制过直接返回映射中对应的新节点否则创建新节点、加入映射然后递归地复制next和random指向的目标节点。这个解法很适合那些已经熟练掌握递归的人它的好处是不需要预先知道链表的完整结构走到哪里需要复制就复制到哪里。在真正的工程场景中如果要复制的是一张带环引用的图或网状结构这种“按需复制 映射去重”的思路几乎就是唯一通用方案——因为图和树不像链表那样有明确的单向遍历顺序必须借助访问记录来避免死循环。对这道题来说递归的深度会随着链表长度线性增加。面试时可以主动提一句“如果链表特别长递归会有栈溢出风险此时迭代写哈希表法更保险。”这句话能显示出你对系统边界有意识。2.4 三种解法怎么选、面试时怎么展示把三种解法摆在一起看选型逻辑其实一目了然解法时间复杂度额外空间复杂度实现难度工程适用性哈希表迭代O(n)O(n)低通用理解成本低拼接拆分O(n)O(1)中高链表专用边界细节多回溯哈希O(n)O(n)中可推广到图和网状结构从面试策略来看我的建议是先快速给出哈希表迭代解法在三五分钟内写对、讲清流程如果面试官追问优化空间再抛出拼接拆分解法重点讲清楚“每个新节点紧跟原节点”这个关键设计最后可以用一两句话提一下递归解法表示你了解这个问题的更一般形式。这样既展示了你掌握基础又显示了你能在约束下做优化、具备抽象视野。千万别“上来就炫拼接法”——这个解法写起来要格外小心如果中途乱了阵脚反而会留下负面印象。先做对再做好这是面试的基本节奏。3. 完整实操三种方法的代码实现与验证过程3.1 基础环境与数据结构定义为了把代码讲清楚统一用Python作为实现语言因为Python的类定义简洁、指针操作直接阅读负担小。在本地或在线编辑器运行都是可以的不需要特殊环境。class Node: def __init__(self, x: int, next: Node None, random: Node None): self.val int(x) self.next next self.random random这是标准的节点定义。你需要留意random是一个可选参数它可以指向任意节点也可能是None。下面我写一套构造测试链表的辅助函数方便后续验证三种写法的正确性。def build_linked_list(values, random_indices): # values: 每个节点的 val 列表 # random_indices: 每个节点 random 指向的下标-1 表示 None nodes [Node(v) for v in values] for i in range(len(nodes) - 1): nodes[i].next nodes[i 1] for i, idx in enumerate(random_indices): if idx ! -1: nodes[i].random nodes[idx] return nodes[0] def print_list(head): # 打印每个节点的 val、random 指向的 val便于验证 cur head while cur: random_val cur.random.val if cur.random else None print(fval{cur.val}, random-{random_val}) cur cur.next这里之所以用下标来构造random是为了让测试更直观。你可以随意指定某个节点的random指向前面的、后面的、甚至它自己从而覆盖各种边界情况。3.2 哈希表迭代解法完整实现实现过程如下def copy_random_list_hash(head): if not head: return None mapping {} cur head # 第一遍创建所有新节点并建立映射 while cur: mapping[cur] Node(cur.val) cur cur.next # 第二遍连接 next 和 random cur head while cur: mapping[cur].next mapping.get(cur.next) mapping[cur].random mapping.get(cur.random) cur cur.next return mapping[head]代码核心有两点第一字典的键是原节点本身值是新节点因为Python里节点对象默认是可哈希的身份哈希第二mapping.get(cur.next)即使拿到None也没关系因为原链表尾节点的next本来就是None映射里并不存在None键get会返回None这正是我们希望的结果。这里有个容易被忽略的细节第一遍只建节点、不连接是为了保证random目标对应的新节点已存在。如果试图在第一遍同时设置random而目标节点还没创建出来就会产生错误。这也是哈希表法“两遍”遍历的根本原因。3.3 拼接拆分解法完整实现实现过程如下def copy_random_list_interleave(head): if not head: return None # 第一步每个原节点后面插入一个新节点 cur head while cur: new_node Node(cur.val) new_node.next cur.next cur.next new_node cur new_node.next # 第二步设置新节点的 random cur head while cur: if cur.random: cur.next.random cur.random.next cur cur.next.next # 第三步拆分新旧链表 dummy Node(0) new_cur dummy cur head while cur: new_cur.next cur.next cur.next cur.next.next new_cur new_cur.next cur cur.next return dummy.next画个图你就能明白每一步的意义。第一步执行完后链表结构变为A - A - B - B - C - C其中带撇的是新节点。第二步遍历时cur指向原节点Acur.next指向Acur.random是原节点C的话cur.random.next就是C正好是A的random该指向的新节点。第三步利用一个虚拟头节点来收集新节点同时把原链表的next恢复原状。第三步里的循环有个精妙之处每次先让new_cur.next cur.next取出新节点再把cur.next cur.next.next让原节点跳过新节点、指回原链表的下一个节点。注意这里先保存了cur.next.next否则一旦改了几层next关系后面的指针就会丢失。我在实际帮别人review这段代码时发现最常见的错误发生在第三步的赋值顺序颠倒。一定要记住先取出新节点并让new_cur前进再恢复cur的next。如果先把cur.next改了后面的new_cur.next cur.next拿到的就是原链表下一个节点新链表就接错了。3.4 回溯哈希表递归实现这个实现短小精悍但思路不同代码也更接近“图深拷贝”的通用模式def copy_random_list_recursive(head): memo {} def dfs(node): if not node: return None if node in memo: return memo[node] new_node Node(node.val) memo[node] new_node new_node.next dfs(node.next) new_node.random dfs(node.random) return new_node return dfs(head)注意一个关键顺序必须先memo[node] new_node再递归设置next和random。如果不先存映射当链表的random指向之前已经走过的节点时递归会无限循环或者导致同一个节点被复制两次。先存映射相当于做了一个“访问标记”后续任何路径再遇到这个节点直接返回已复制的副本。这种“先标记、再递归”的顺序和图的深度优先遍历一模一样。如果你将来面对的问题不是链表而是图只要把memo换成通用的访问标记集合再按邻接关系递归思路可以直接复用。这也解释了为什么很多深拷贝问题的标准解法框架都是这条路。3.5 三种实现的内存变化过程与正确性验证写完了函数怎么确定它们真的对可以用构造的测试链表做对比验证但要注意验证深拷贝是否成功不能只看打印的值是否相等还要检查两个链表是否物理独立。head build_linked_list([7, 13, 11, 10, 1], [1, 3, 0, -1, 0]) new_head_hash copy_random_list_hash(head) new_head_inter copy_random_list_interleave(head) new_head_rec copy_random_list_recursive(head) print(原链表:) print_list(head) print(哈希法新链表:) print_list(new_head_hash) print(拼接法新链表:) print_list(new_head_inter) print(递归法新链表:) print_list(new_head_rec) # 物理独立验证 print(原链表头地址:, id(head)) print(新链表头地址:, id(new_head_hash))运行后三条新链表的val和random指向的val必须与原链表完全一致同时新链表的节点地址和原链表不同。判断深拷贝的真正标准是对于任意一个非空random原链表的node.random和对应新节点的new_node.random不应该是同一个对象而是两个值相等的独立对象。可以在验证代码里加一句def assert_deep_copy(original, cloned): o, c original, cloned while o: if o is c: raise RuntimeError(节点不应共享) if o.random is not None and c.random is not None: if o.random is c.random: raise RuntimeError(random 不应共享) o, c o.next, c.next如果assert_deep_copy通过说明三种方法都完成了真正的深拷贝。很多现代编程题平台会直接在你提交的代码里内置类似的校验逻辑这也是为什么“直接把原节点复制给新节点”这种伪写法永远跑不过测试的原因。4. 面试追问、代码走读与工程延伸4.1 面试官常见追问汇总这道题因为在LeetCode上热度高、解法多所以面试官常追加的问题也比较固定。整理几个常见追问和应对思路。第一个问题是“有没有O(1)空间的做法”。这就是让你从哈希表法切到拼接拆分法。你要能主动讲出“利用新节点紧跟原节点这一物理关系来替代映射表”的核心思想并且手写完整三连步。第二个问题是“如果链表很长递归解法会有什么风险”。答案是深度太长时栈溢出。如果你能说出“递归本质上使用系统栈空间复杂度在最坏情况下是O(n)所以生产环境优先推荐迭代法”面试官会认为你具备工程意识。第三个问题是“如果random指向null怎么办”。其实这个问题在代码里天然解决了mapping.get(None)返回None拼接法里if cur.random为空就跳过赋值递归法里if not node直接返回None。但要主动说清楚这一点表示你在设计时已经覆盖了空指针分支。第四个问题是“这个题和普通链表的复制有什么区别”。普通链表复制只要顺着next走一遍逐个创建新节点即可复杂链表复制无法在第一次遍历时确定随机指针的对应因为对应节点可能还没创建。关键在于“随机指针引用了尚未创建的目标节点”所以需要额外的记录或位置关联。还有一个更有压迫感的追问“如果原链表有环你的解法还能工作吗”这里要小心。如果next构成环拼接拆分法的第三步会因为cur.next永远不为空而陷入死循环哈希表和递归解法因为有映射记录理论上可以处理走回头路。面试中可以先说明“这道题默认链表无环”再补充如果真有环需要增加访问标记集合来防止重复处理——这又回到了通用深拷贝的框架。4.2 手写实现时的常见错误与自检清单代码写得再熟练手写场景下总容易出各种隐蔽问题。我把踩过和被别人踩过的坑集中列一下写完代码后逐条自查。节点创建顺序混乱是第一坑。哈希表法第一遍必须只建节点、记录映射不能边建边连next否则第二轮处理random时可能找不到对应节点。拼接法的第一步同样是“先插完所有新节点再处理random”顺序错了整个结构就乱了。修改链表结构时丢失后续节点引用是第二坑。尤其在拼接法第三步cur.next.next这个表达式要先保存再用。很多人在cur.next cur.next.next之后还要用cur.next做下一步此时它已经被改成下一个原节点逻辑实际是正确的但如果把顺序写反就会丢掉剩余链表。递归法忘记在递归前先登记节点是第三坑。memo[node] new_node必须放在递归调用之前。少数人会把这个赋值放在最后结果遇到环或回头指针时无限递归栈直接爆掉。这一点在写递归时务必形成肌肉记忆。对空链表考虑不足是第四坑。三种解法开头都没忘记if not head: return None但手写时很容易漏掉。如果输入是空链表后续任何对head.next的操作都会抛空指针异常。这个判断虽然简单却极其重要。自检清单其实可以浓缩成口诀建映射了吗哈希表法要确保每个新节点都在映射中改链接前保存了后继吗拼接法第三步尤其注意递归入口先登记了吗递归法要先memo再递归空链表和单节点覆盖了吗手写前先预演一下边界输入写完后拿题目给的示例跑一遍逻辑了吗至少心算一次整个流程4.3 这个题在真实项目里到底怎么用聊完面试再说点实在的。我在实际开发中确实遇见过好几个和这道题同构的场景。第一个场景是图形编辑器的图层树复制。在一个绘图软件里每个图层不仅记录自身图形还可能记录一个“关联图层”——比如蒙版绑定、阴影引用源。当用户复制一个分组时需要深拷贝整个图层树同时保留所有关联引用。当时我一看数据结构第一反应就是“这不就是复杂链表的复制么”只不过节点从链表节点换成了图层对象随机指针变成了关联字段。最后就是用哈希表映射的方式实现了完整深拷贝。第二个场景是分布式任务调度中的任务快照。某个任务节点除了有上下游依赖还可能有一个“回调到任意前置任务”的引用。做快照备份时需要把整个任务图完整复制一份不能共享内部状态。这种需求比链表更复杂因为有多个入口、多个分支但如果抽象成“带随机引用的图”底层的“先建节点存映射再连关系”的思路完全一致。第三个场景是某些解释器或编译器中复制带变量环境引用的AST节点。语法树的节点会引用环境记录环境之间又有作用域链深拷贝这种结构同样需要处理好“引用对应关系”。理解了复杂链表复制你就理解了这一类问题的通用解法后续遇见了只需把数据结构替换掉即可。这也是为什么我一直建议真正想去大厂的人不要只背结论要培养“把题目抽象成模型”的能力。这道题背后真正抽象的模型是一组对象对象之间存在显式顺序引用和随机引用要求在不共享底层对象的前提下复制整体结构。只要能识别出这个模型无论数据结构怎么变你都能找到切入点。4.4 一些个人经验和踩坑记录最后分享几条自己在刷题和指导别人刷题过程中总结出来的经验。第一不要只背代码。见过太多人把哈希表法的代码背得滚瓜烂熟但你让他解释“为什么第一遍不能连next”他支支吾吾半天答不上来。这种“记忆型选手”一旦遇到变体题比如把链表换成树就会露馅。正确方式是每次写完解法都要用“如果哪天我把这里的指针换成别的结构我该怎么做”来拷问自己。第二手写拼接拆分法时拿到草稿纸先画图。我在面试现场见过一位候选人他嘴上说得挺好但画完图发现第三步拆链时左右指针同步关系没理顺写完代码也看不出错在哪。建议在准备阶段就把A-A-B-B这种图画过三五遍等画到不需要思考就能定位指针位置才算真的掌握了。第三如果时间紧张至少要把哈希表法练到“闭眼能写”的熟练度。因为它的正确性最容易保障也最容易在压力环境下写稳。拼接拆分和递归属于锦上添花能做更好但不要因为追求所有解法而搞乱了基础和节奏。第四对验证方法要认真对待。写完后不要只满足于平台用例通过要自己构造三种特殊场景random指向前一个节点、random指向后一个节点、random指向自身。这三种场景分别用来验证回溯映射在不同方向上的正确性基本能覆盖大部分隐蔽问题。第五关于“节点比较”这个细节我们值得单独提一句。很多编程语言里判断两个自定义类的实例是否相等默认是引用比较。因此“验证两个链表是否相等”时如果简单用node1 node2去比较大部分情况是false的。你需要显式比较val和random.val。这个细节在写单元测试时尤其容易踩坑我第一次写验证逻辑时就被测试框架的结果误导过以为算法写错了排查半小时发现是比较方式的问题。另外一个由工程出发的建议是如果你在写真实代码时用哈希表法做深拷贝尽量给mapping选用以对象身份为键的哈希结构Python的字典天然如此Java和C中要注意重写hashCode和equals或者使用基于引用身份的IdentityHashMap。否则一旦节点类重写了equals和hashCode基于值相等性的映射可能导致两个不同节点被误判为同一个键深拷贝就会悄悄出错。这个问题在刷题场景看不出但在真实系统的类继承设计中真的会中招。这道题练完你顺手也就掌握了这类深拷贝问题的通用方法论。无论是面试中手撕代码还是在工程里复制一个带引用的对象图都能做到心里有谱。最后再送一个小技巧写完整代码后花三十秒在脑子里把链表长度分别为0、1、5的情况各跑一遍这一遍“脑内调试”能帮你避开绝大多数低级错误比多刷十道题都管用。

相关新闻

ClaudeCode-cli Windows终端安装,并配置TaoToken链接

ClaudeCode-cli Windows终端安装,并配置TaoToken链接

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 20:57:25 阅读更多 →
Cursor AI 写 Unity 脚本总报 401?把 Base URL 改到 TaoToken 试试

Cursor AI 写 Unity 脚本总报 401?把 Base URL 改到 TaoToken 试试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 20:57:25 阅读更多 →
视频推荐小程序下载接口实战:SpringBoot流式下载与断点续传

视频推荐小程序下载接口实战:SpringBoot流式下载与断点续传

做视频推荐类小程序,功能开发到“能推荐”只是完成了三分之一。推荐列表返回给用户之后,用户感兴趣、点击查看详情、真正把视频下载到本地,这才算一个完整的闭环。前面几讲我们解决了推荐结果怎么来、接口怎么返回、前端怎么展示,…

2026/10/18 20:57:25 阅读更多 →

最新新闻

前端如何开发Agent应用:认知边界、责任划分与实战Demo

前端如何开发Agent应用:认知边界、责任划分与实战Demo

1. 别再被“Agent”三个字吓住:前端同学的第一块认知拼图“Agent开发不是模型训练”——这句话我第一次在某次内部技术分享会上听到时,下意识摸了摸自己的键盘,心想:这跟我有啥关系?我连Prompt Engineering都还在抄模板…

2026/10/18 22:00:20 阅读更多 →
Python电商评论情感分析实战:从数据清洗到Streamlit可视化

Python电商评论情感分析实战:从数据清洗到Streamlit可视化

简介:一套面向电商数据分析、自然语言处理及课程设计场景的Python买家评论情感分析项目,包含完整源码、模型文件、多类评论数据集和详细代码注释,可支撑毕业设计、课程作业、答辩演示或入门实践。项目所有代码均测试运行成功,曾获…

2026/10/18 22:00:20 阅读更多 →
CSS hover父子联动原理与高性能实践指南

CSS hover父子联动原理与高性能实践指南

1. 项目概述:hover不是“悬停”那么简单,它是CSS中少有的父子联动开关你有没有试过,鼠标移到一个导航栏的菜单项上,不仅这个菜单项变色,它下面的二级下拉菜单也跟着展开?或者把鼠标移到一张商品卡片上&…

2026/10/18 22:00:20 阅读更多 →
信贷风控实战:从特征工程到模型调优的贷款违约预测指南

信贷风控实战:从特征工程到模型调优的贷款违约预测指南

简介:面向金融科技与信贷风控场景的机器学习实践源码,聚焦贷款违约风险预测,适用于金融机构信用评估、数据分析与建模学习者。压缩包共23个文件,约13.77MB,包含7个Python源码、2个CSV训练测试数据集、11个PNG图表&…

2026/10/18 22:00:20 阅读更多 →
面试官问:Agent评测重跑一遍分数就变,你先查哪里?

面试官问:Agent评测重跑一遍分数就变,你先查哪里?

面试官问 “同一个Agent,评测重跑一遍分数就变了,你先查哪里?” 最常见的反应是去改提示词,或者认定模型这次发挥不好。可要是负责打分的判定器读到的是上一轮留下的结果文件,一个什么都不做的Agent也能判通过。所以…

2026/10/18 22:00:20 阅读更多 →
2026 年 AI Skill 生态横评:TaoToken 统一 Key 通道下,这几个平台到底差在哪?

2026 年 AI Skill 生态横评:TaoToken 统一 Key 通道下,这几个平台到底差在哪?

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 21:59:19 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →