链表高频面试题:双指针一次遍历求倒数第k个节点
1. 从一道高频面试题说起“面试题.返回倒数第k个节点”这行标题过去几年我见过太多次了——不管是校招还是社招不管是后端岗还是客户端岗这道题出现的频率高得离谱。它考察的知识点不算难却能把一个人的基本功底子摸得清清楚楚链表的遍历方式、边界条件的敏感度、双指针的思路、还有代码的稳定性。这道题本身极其简单给你一个单链表返回倒数第 k 个节点的值。比如链表是1 - 2 - 3 - 4 - 5k 2那倒数第 2 个节点就是 4。很多同学第一次看到这题脑子里第一反应是“这有什么好考的先遍历一遍数长度再正着走 n-k 步不就完事了”确实这么做完全正确时间复杂度 O(n)空间复杂度 O(1)没有任何问题。但为什么面试官偏爱这道题因为它在“最优解”之上还藏着一个更巧的思路——双指针。这个思路如果没人点破很多人当场想不到而想到了就是一次展示自己思维深度的机会。这篇文章我会把这题从题干到边界条件从朴素解法到双指针写法包括面试现场怎么沟通、怎么主动给出更优解、怎么写代码不容易出 bug全部拆开讲透。后面还会顺带说几个高频变体比如“删除倒数第 k 个节点”“求链表中点”因为掌握了核心思路这些变形题就是白送分。2. 题目解读与思路拆解2.1 原题到底在问什么先明确题目细节。很多版本里这题会给出单链表的定义通常是这样的结构struct ListNode { int val; struct ListNode *next; };函数签名大概是int kthToLast(struct ListNode* head, int k);返回的是节点的值int而不是节点指针也不是要求删除节点。这里有个小坑要特别注意题目说的是“倒数第 k 个节点”k 是从 1 开始计数的而不是从 0 开始。也就是说k 1 时返回的是链表最后一个节点的值k 链表长度时返回的是头节点的值。这个约定搞反了后面全盘皆错。题目的隐含假设是 k 合法也就是1 k 链表长度。但实际面试时你最好主动问一句“k 会不会大于链表的长度如果会我要怎么处理”这不是多此一举面试官会很在意这种对边界条件的敏感性。2.2 为什么这是一个好题这道题看似简单但它至少踩中了三个考察点。第一是链表的基本功。链表不是数组没有随机访问能力你不能直接通过下标取倒数第 k 个元素。这强迫你思考“怎么在单向链表上往前走”而不是条件反射地套数组逻辑。第二是边界条件。空链表怎么处理k 1 怎么办k 链表长度怎么办k 非法怎么办每个边界点都是一次判断你是否细心的地方。第三是最优解思维。暴力解法可以过但能不能想到一次遍历就拿到结果这是区分“会写代码”和“会思考算法”的关键分界线。双指针解法不复杂但它体现的是一种“用距离差来定位”的思想这种思想在很多算法题里反复出现。2.3 两条主路线遍历计数与双指针先说最自然的方案——两次遍历。第一次遍历从头走到尾统计链表节点个数记为 n。第二次遍历从头再走 n - k 步到达的节点就是倒数第 k 个节点。举个例子链表总长 n 5k 2那么正数第 4 个节点就是倒数第 2 个节点从头走 5 - 2 3 步就到了。这个思路简单可靠时间复杂度 O(n)空间复杂度 O(1)。这已经能通过所有测试用例了。再说双指针方案——一次遍历。初始化两个指针 slow 和 fast都指向头节点。先让 fast 往前走 k 步。然后 slow 和 fast 一起往前走每轮各走一步。当 fast 走到链表尾部null时slow 指向的就是倒数第 k 个节点。背后的逻辑其实是一种“长度差”的物理直觉fast 先走了 k 步相当于在 slow 前面拉开了一个长度为 k 的窗口。当 fast 触底时这个窗口的尾部正好卡在链表倒数第 k 个节点上。那为什么敢保证这个窗口一直有效因为在 fast 先走 k 步的过程中如果链表长度不足 kfast 会提前走到 null这时就说明 k 非法。这恰好也成了检查 k 是否越界的天然机制。3. 解法一先数长度再定位3.1 完整代码实现这个方案写起来非常简单几乎不会有语法层面的坑。我用 C 语言版本作为主实现因为面试场景下 C 语言最常见而且更能体现对指针的理解。int kthToLast(struct ListNode* head, int k) { if (head NULL) { // 根据题目约定处理这里假设返回 -1 表示非法 return -1; } int len 0; struct ListNode* p head; while (p ! NULL) { len; p p-next; } // 如果 k 不在合法范围内按约定处理 if (k 0 || k len) { return -1; } int steps len - k; p head; while (steps 0) { p p-next; steps--; } return p-val; }这段代码的关键点有三个空链表判断、k 合法范围判断、第二次遍历的步数计算。每一步都很直白没有任何绕弯的地方。3.2 时间复杂度与空间复杂度分析两次遍历但每次都是完整的 O(n) 量级所以总的时间复杂度是 O(n)。严格来说第一次遍历花了 n 步第二次最多 n 步加起来是 2n 步但常数项在复杂度分析里是被忽略的因此仍然是 O(n)。空间上只用了两个指针变量没有额外分配与链表规模相关的内存所以空间复杂度是 O(1)。这个解法的优点是逻辑清晰、不容易出错特别适合在面试一开始、还没有深入思考时就先写出一个“保底版本”。缺点也很明显链表要遍历两遍。对于单链表这种只能顺序访问的结构两遍遍历在一些极端场景下会是性能短板——比如链表数据在磁盘上、或者链表节点数量巨大的流式场景两遍遍历的代价可能是实实在在的。3.3 这个解法的两个隐藏问题第一个隐藏问题是如果你拿到的头节点是空的这个解法能不能优雅处理能但前提是你必须事先想清楚返回值约定。很多面试者在代码里直接return -1如果面试官追问“节点的 val 可能本身就是 -1 怎么办”就会有点尴尬。所以更稳的做法是先跟面试官对齐约定或者用一个独立的错误标志比如bool* error来传出错误信息。第二个问题是第二次遍历时用while (steps 0)这个写法比for (int i 0; i steps; i)更不容易因为步数计算错误而出 bug。因为len - k这个值如果算错问题通常出在读题不仔细——比如把 k 当成从 0 开始计数那len - k就会多走一步直接取到倒数第 k1 个节点。这个细节我会在后面的常见问题里再展开。4. 解法二双指针一次遍历面试官真正想看的4.1 核心思路详解双指针解法的核心就一句话让一个指针先走 k 步然后两个指针同步前进快的走到头时慢的正好在倒数第 k 个位置。很多同学第一次看到这个解法时会觉得“这不就是数学技巧吗有什么了不起的”但仔细想想它其实是一种非常通用的思想——通过两个指针之间的相对距离来定位位置。这个思想在“判断链表是否有环”快慢指针速度差为 2、“寻找链表中点”速度差为 1等题目里都会用到。也就是说学会这一题等于打通了双指针类题目的任督二脉。为什么快指针先走 k 步而不是 k-1 步这取决于你对“倒数第 k 个”的定义。我在前面强调过k 从 1 开始计数。你要保证的是当 fast 到达 null 时slow 指向倒数第 k 个节点。如果 fast 先走 k 步那么当 fast 再走完剩余的 n-k 步时slow 也同步走了 n-k 步。slow 从第 1 个节点开始走了 n-k 步之后停在第 n-k1 个节点这就是倒数第 k 个。数学关系严丝合缝。如果这里你忘了 k 的计数约定改成 fast 先走 k-1 步那得到的结果就是倒数第 k1 个节点。这是一个特别容易犯的错面试时一定要先确认清楚。4.2 完整代码实现int kthToLast(struct ListNode* head, int k) { if (head NULL || k 0) { return -1; } struct ListNode* fast head; struct ListNode* slow head; // 第一步fast 先走 k 步 for (int i 0; i k; i) { if (fast NULL) { // 链表长度小于 k说明 k 非法 return -1; } fast fast-next; } // 第二步fast 和 slow 同步前进 while (fast ! NULL) { slow slow-next; fast fast-next; } return slow-val; }这段代码只遍历了一次链表每一步操作都是常数时间总耗时恰好是 n 次指针移动时间复杂度 O(n)比两次遍历的版本少了一半的常数。空间复杂度仍然是 O(1)。4.3 为什么双指针解法更优秀从复杂度上看O(n) 和 O(2n) 在渐进意义上没有区别但实际工程和面试评价中一次遍历往往更能体现代码的“优雅程度”。更重要的是双指针解法自带 k 合法性检查机制。在两次遍历的版本里你需要先数完整个链表才知道 k 是否越界而在双指针解法里fast 先走 k 步的过程中如果撞上了 null立刻就能判断 k 非法不需要额外扫描一遍。虽然渐进复杂度没有改变但在处理“超大链表 非法 k”的场景下双指针确实能更快地报错。还有一个不能忽视的点是双指针解法在“流式数据”或“无法二次遍历的数据结构”下依然成立。比如你拿到的是一个只能单向遍历一次的迭代器或者数据源不支持回溯这时两次遍历的方案直接失效但双指针依然能算出倒数第 k 个元素。这个概念虽然在面试题里不常被追问但理解了这一层你的认知深度就和只背答案的人拉开了差距。我自己在面试候选人的时候如果对方能自己推导出双指针解法我会觉得这个人的“算法直觉”是到位的。如果对方只能答出两次遍历我会引导一下“能不能只遍历一次”很多人在提示之后能反应过来也有一些人在提示之后也写不对——他们已经背会了答案却没理解答案背后的距离差逻辑。所以这一题表面上是在考代码实际上在考你是不是真懂。4.4 来个递归视角的补充还有第三类解法递归。递归的思路是先递到链表末尾然后在回溯过程中计数int kthToLastHelper(struct ListNode* head, int k, int* count) { if (head NULL) { return -1; } int val kthToLastHelper(head-next, k, count); (*count); if (*count k) { return head-val; } return val; } int kthToLast(struct ListNode* head, int k) { int count 0; return kthToLastHelper(head, k, count); }这个方案写起来很有趣但有几个致命问题一是递归深度等于链表长度链表很长时会爆栈二是它依赖回溯计数逻辑上不如双指针直观。所以在面试里递归可以作为“另一个思路”提一嘴但我不建议把它作为主答案。除非面试官明确问“有没有不用循环的写法”否则答递归反而会暴露你对空间复杂度的敏感性不够——递归的空间复杂度是 O(n)而循环解法是 O(1)。5. 边界条件与测试用例设计5.1 必测的六个边界场景写代码只是第一步真正区分水平的是能不能面面俱到地把测试用例列出来。我一般会在面试前默写一套标准测试场景这套场景在这道题里就是下面六个场景输入示例预期输出测试意图常规场景1-2-3-4-5, k24验证基本功能k1最后一个节点1-2-3, k13验证边界最小 kk链表长度头节点1-2-3, k31验证边界最大合法 k链表只有一个节点7, k17验证单节点场景k01-2, k0非法值验证非法输入k链表长度1-2, k5非法值验证越界输入其中最容易翻车的是 k1 和 k链表长度这两个场景。k1 时如果某个解法里把 fast 先走的步数写成 k-1那么得到的结果是倒数第 2 个节点第一个用例就会挂。k链表长度时如果 fast 先走 k 步之后直接返回 slow-next也会出错。关键时刻这两条用例能把错误直接揪出来。5.2 测试代码长什么样以 C 语言为例简单写一个测例#include stdio.h #include stdlib.h struct ListNode { int val; struct ListNode* next; }; struct ListNode* createNode(int val) { struct ListNode* node (struct ListNode*)malloc(sizeof(struct ListNode)); node-val val; node-next NULL; return node; } void freeList(struct ListNode* head) { while (head ! NULL) { struct ListNode* tmp head; head head-next; free(tmp); } } int main() { // 构造 1-2-3-4-5 struct ListNode* head createNode(1); struct ListNode* p head; for (int i 2; i 5; i) { p-next createNode(i); p p-next; } printf(k2 - %d (期望 4)\n, kthToLast(head, 2)); printf(k5 - %d (期望 1)\n, kthToLast(head, 5)); printf(k1 - %d (期望 5)\n, kthToLast(head, 1)); freeList(head); return 0; }跑一遍三个输出应该分别是 4、1、5。这一步过了基本的正确性就有保障了。5.3 空链表和 k 非法的返回约定这里我想强调一个工程化的细节面试题里“返回 -1 表示非法”是一种偷懒的约定因为题目往往没规定 val 的取值范围。但在实际系统中链表的 val 可能是任意 int 值-1 完全有可能是合法数据。那么你要么使用一个独立的错误标志要么改用返回结构体的方式struct Result { int val; int valid; // 1 表示有效0 表示非法 };面试时和面试官确认清楚这个约定本身就是加分项——它展示了你对“函数接口健壮性”的思考。我见过不少候选人代码完全正确但只因在“返回什么表示非法”这件事上和面试官各说各话浪费了不少时间。提前对齐大家都舒服。6. 面试现场怎么把这题答出亮点6.1 先说思路再动手我见过太多面试者拿到题目就开始敲键盘沉默了十分钟之后提交一段自己都觉得不太对的代码。正确做法是先把思路讲清楚“我的第一反应是先遍历链表拿到长度然后走 n-k 步就直接能取到目标节点。这样做时间复杂度 O(n)空间 O(1)但需要遍历两遍。”“为了让代码更优雅我可以再用双指针优化一个指针先走 k 步然后两个指针同步走快的到尾了慢的就是答案。这样只用遍历一次。”在你把“两次遍历”和“双指针”都写在纸面上之后面试官会看到你有完整的思维链而不是只会背一种解法。这个过程的收获比单纯写对代码要大得多。6.2 主动给出测试用例写完代码之后不要傻坐着等面试官开口。你直接说“我理了几个边界场景k1 要能取到最后一个节点k链表长度要能取到头节点空链表和 k 越界要能返回错误。我先用这三个用例自查一下。”这一句话一说出来你的印象分就上去了。因为大部分面试者写完之后只会说“我觉得没问题”只有少数人会主动验证。我不是说形式主义很重要而是“主动验证”本身就是一种工程好习惯——写完代码不是终点跑通用例才是。6.3 如果面试官追问“链表长度未知怎么办”双指针解法并不依赖链表长度所以在“链表长度未知”这个前提条件下依然是正确答案。追问到这里你正好可以进一步解释“这种解法适合流式场景因为不管链表多长我只需要维护两个指针在 fast 走到头时 slow 就定位到了目标节点。整个过程没有额外的存储开销。”如果面试官继续追问“如果链表特别长比如上亿个节点有没有更快的办法”你可以坦诚地分析在单链表上找倒数第 k 个节点任何算法都必须遍历一次才能知道链表的尾在哪里所以时间下界就是 O(n)。不存在 O(log n) 的解法——因为链表缺少随机访问能力你不可能跳过中间节点。这种“知道自己为什么做不到更好”的回答比强答一个错的“优化方案”更显专业。6.4 变体一刷删除倒数第 k 个节点这题在原题基础上多了一个“删除”动作往往还要求只能遍历一次。思路和双指针一脉相承唯一差别是为了让 slow 停在“倒数第 k 个节点的前一个节点”fast 需要先走 k1 步。这样当 fast 走到 null 时slow-next 正是要删的节点struct ListNode* removeNthFromEnd(struct ListNode* head, int k) { struct ListNode dummy; dummy.val 0; dummy.next head; struct ListNode* fast dummy; struct ListNode* slow dummy; for (int i 0; i k 1; i) { if (fast NULL) { // k 非法 return head; } fast fast-next; } while (fast ! NULL) { slow slow-next; fast fast-next; } struct ListNode* toDelete slow-next; slow-next toDelete-next; free(toDelete); return dummy.next; }这里用了一个虚拟头节点 dummy目的是避免删除头节点时的特殊处理。这是链表面试题里一个非常常用的技巧——它把“头节点也可能被删”的边界情况统一处理了。你如果能主动写出 dummy 节点版本面试官会意识到你处理链表时不是只会背模板。6.5 变体二刷求链表中点求单链表的中点也可以用双指针只是这次两个指针的步长不同slow 每次走一步fast 每次走两步。当 fast 到尾时slow 就是中点。这个思想跟“倒数第 k 个节点”一脉相承——都是利用两个指针之间的距离差来定位。struct ListNode* middleNode(struct ListNode* head) { struct ListNode* slow head; struct ListNode* fast head; while (fast ! NULL fast-next ! NULL) { slow slow-next; fast fast-next-next; } return slow; }这个代码和“倒数第 k 个”相比唯一差别在于 fast 的步长从“先走 k 步”变成了“每次走两步”。背后的本质仍然是距离差。你如果在面试里能把这两题关联起来讲面试官对你的评价会从“会写题”上升到“理解模式”。6.6 变体三刷判断链表是否有环判断链表是否有环用的是同一个双指针框架slow 每次走一步fast 每次走两步。如果链表有环fast 和 slow 终会相遇如果无环fast 会先走到 NULL。int hasCycle(struct ListNode* head) { struct ListNode* slow head; struct ListNode* fast head; while (fast ! NULL fast-next ! NULL) { slow slow-next; fast fast-next-next; if (slow fast) { return 1; } } return 0; }这道题在“倒数第 k 个”的基础上又多了一层“为什么快慢指针一定会相遇”的数学论证。但它用的还是那个核心框架两个指针一段距离差一个明确的终止条件。一法通万法通就是这个意思。7. 高频踩坑点与经验总结7.1 读题不清k 的计数起始值搞错这是最最常见的翻车点。题目里如果写的是“倒数第 k 个”k 通常从 1 开始但有些练习题或变体里写的是“倒数第 k 个节点k 从 0 开始”。两者代码差距只有一步却会导致结果完全不同。我的建议是不管你刷过多少遍这题每次拿到题目都先确认一下“k 的语义”再动手。注意如果题目说“返回倒数第 k 个节点”且没有特别说明 k 的起始值默认从 1 开始。面试时口头和面试官确认一次不吃亏。7.2 空指针解引用在双指针版本里fast fast-next这一步如果 fast 已经为 NULL 就会崩溃。所以在 fast 先走 k 步的循环里每一步都要检查fast NULL。很多同学在“While fast ! NULL”的主循环里记得判断偏偏在“先走 k 步”的阶段不判断一旦 k 大于链表长度当场崩溃。这个细节虽然简单但代码写快了很容易忽略。7.3 面试不要只给一个解法就算你只会双指针也最好提一嘴“还有一种朴素做法是两次遍历”。因为你展示的不是“我知道最优解”而是“我理解这个问题域”——哪一种解法在什么场景下适用各有什么取舍。这种思维在系统设计面试里会更吃香但在算法题里同样能体现功底。7.4 刷题建议画图链表题的抽象性很强尤其是双指针这种“看代码觉得挺对但说不清为什么”的题目我强烈建议你在草稿纸上画图。画出链表节点、画出 slow 和 fast 每一步的位置跑五到六个节点的小例子你就能直观感受到那个“距离差窗口”是怎么滑到倒数第 k 个位置的。这个习惯帮我解决过很多链表题比盲目刷十道题都管用。7.5 从面试题到工程思维说句掏心窝的话现实中几乎没有人会真的让你写一个“返回链表倒数第 k 个节点”的函数。但这个题背后的能力模型在真实系统里每天都在被调用。比如消息队列的批量消费、日志文件的尾部追踪、缓存淘汰策略里某些场景的指针维护本质上都是这种“在单向流式数据里定位某个位置”的问题。我后来带新人时总喜欢拿这道题当开场白——不是因为它是所谓的高频题而是因为它能把“数据结构的理解”“边界条件的敏感度”“算法优化的直觉”“代码实现的稳健性”一次性全测出来。一个候选人如果在这道题上表现得既快又稳那他在后续更复杂的算法题上通常也不会差。最后分享一个我自己刷题的仪式感每做完一道链表题我都会自己写出三个“变态用例”再跑一遍——空链表、超长链表、k 恰好是链表长度。这不只是在验证代码更是在培养一种肌肉记忆算法不是只跑通 happy path 就结束的真正的稳定恰恰来自那些没人注意的角落。希望读完这篇文章的你也能养成这个习惯。

相关新闻

BrowserSkill:用CLI驱动Chrome的浏览器自动化工具,让AI Agent轻松操控浏览器

BrowserSkill:用CLI驱动Chrome的浏览器自动化工具,让AI Agent轻松操控浏览器

1. 从命令行到浏览器:BrowserSkill 到底在解决什么问题第一次看到 BrowserSkill 这个名字,我脑子里蹦出来的画面是:一个跑在终端里的命令行工具,能直接操控 Chrome 浏览器,把网页打开、点击、填表、截图、抓数据这一整…

2026/10/18 18:29:58 阅读更多 →
SolidWorks本地AI插件:DeepSeek-R1驱动的工程智能体

SolidWorks本地AI插件:DeepSeek-R1驱动的工程智能体

简介:本资源是面向SolidWorks中高级用户与二次开发工程师的DeepSeek智能插件项目源码包,旨在解决CAD设计过程中建模效率低、参数优化依赖人工等痛点,支持智能建模、AI辅助参数调优等高阶功能。压缩包仅4KB,含3个核心文件&#xff…

2026/10/18 18:28:58 阅读更多 →
易元AI实操:自动镜头标记与脚本生成,素材整理效率翻倍

易元AI实操:自动镜头标记与脚本生成,素材整理效率翻倍

做后期这行,免不了跟素材较劲。这几年接项目,甲方习惯把所有拍摄原片一股脑扔过来,经常是几十条上百条片段,很多连文件名都懒得改。手动拖时间轴看画面、标注镜头边界、找关键瞬间,再逐条听录音转成文字、整理成脚本—…

2026/10/18 18:28:58 阅读更多 →

最新新闻

C#股票量化实战:掘金行情接口封装与板块数据接入

C#股票量化实战:掘金行情接口封装与板块数据接入

简介:面向C#股票量化开发者的实战资源包,以掘金量化接口为主线,讲解如何获取股票行情与同花顺版块数据,并融入量化交易策略。内容从量化交易的概念与数学模型出发,系统梳理了通过HTTP调用掘金接口获取实时价格、历史K线…

2026/10/18 19:14:15 阅读更多 →
亿图图示 EdrawMax 6.8 绿色便携版部署避坑指南

亿图图示 EdrawMax 6.8 绿色便携版部署避坑指南

简介:亿图图示EdrawMax 6.8中文绿色便携版面向需要快速绘制专业图表的办公人群、学生与设计爱好者,免安装、不写注册表,可直接在U盘或移动硬盘运行,解决多设备切换时无法随时使用图形设计工具的问题。压缩包为rar格式,…

2026/10/18 19:14:15 阅读更多 →
深度强化学习双目标动态感知路径规划:毕设源码拆解与实战

深度强化学习双目标动态感知路径规划:毕设源码拆解与实战

简介:基于深度强化学习的双目标动态感知路径规划毕业设计源码,以Python实现,主要面向计算机、人工智能、自动化、物联网等专业的在校生、教师或研发人员,适用于毕业设计、课程设计、项目演示及深度学习入门进阶。项目聚焦动态环境…

2026/10/18 19:14:15 阅读更多 →
Agent项目落地全流程:从Demo到生产的工程化实务

Agent项目落地全流程:从Demo到生产的工程化实务

做Agent项目这几个月,我最大的感受是:Demo和落地是两回事。会议室里跑通一个“会调用工具、能自动回答问题”的原型只需要一下午,但真要把它放到生产环境里面对真实流量、真实数据、真实用户的奇怪输入,问题一个接一个地冒出来。工…

2026/10/18 19:14:15 阅读更多 →
基于深度学习的机械振动信号故障诊断:从数据生成到模型部署

基于深度学习的机械振动信号故障诊断:从数据生成到模型部署

简介:这份资源面向机械故障诊断方向的学习者与工程实践者,提供一套基于深度学习的完整项目源码,帮助理解如何用Python将振动、温度等传感器数据转化为可用的故障识别模型。包内共88个文件,以45个py源码与43个pyc编译文件为主&…

2026/10/18 19:14:15 阅读更多 →
OpenClaw智能体全流程部署:从环境配置到多Agent自动化实战

OpenClaw智能体全流程部署:从环境配置到多Agent自动化实战

说实话,我早就受够了在不同AI工具之间来回切换、复制粘贴、手工串联任务的繁琐日子。直到我把一个开源智能体框架OpenClaw完整部署下来,从环境准备、角色配置、工具接入到多流程联动跑通,才发现原来AI智能体全流程操作并没有想象中那么玄乎&a…

2026/10/18 19:13:14 阅读更多 →

日新闻

基于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 阅读更多 →