Code59 · 59 题零基础逐题讲解¶
这套讲解面向第一次系统学习数据结构算法的读者。每题都先说明完整任务、已知条件和输出目标,再进入状态推演、代码和自测。
全部 59 题现在从独立的“题目与要求”开始:先给出依据原题整理的完整任务,再列已知条件、需要得到的结果、输入输出示例、约定与提醒及题干回源。读懂题目以后,再看人话讲解、变量含义、逐步状态、完整函数、逐句解释和自测。简洁复习版仍在每题末尾“学懂后回看”。
第一次学,从这里开始:第 0 课:数组、C 符号、指针、递归、队列与图的基础。 不要求你事先懂 p->next、A[k++]、调用栈或 O(n)。某个概念暂时看不懂,可以在读到对应题目时返回查阅,不必先背完整个第 0 课。
题干标为“依据原题整理”,不是原书逐字原文;示例、约定、练习和逐句解释明确标为教学补充。第 29、30 题原资料未附的视频图或未给定的变量数值会明确说明,不补造原图、原题数值;第 57、58 题原资料只有算法题名,已按锁定实现补全练习要求并标注。完整函数仍取自当前版本锁指定的正式稿,保留原变量名;它们是固定版本学习副本,不自动跟随原稿升级。
网页版从目录和检索结果进入每道题时,以统一题号 q01 至 q59 定位到题目开头;如果打开的是“代码段”小节,可点击代码上方的“↑ 回到本题题目”。
这版怎样做到“零基础”¶
- 每题先列题干、条件、输出目标和小示例,明确“到底给了什么、要做什么”;然后才引入双指针、递归等解法。
- 数组题记录读下标、写下标、复制后的数组;链表题分清“移动指针”与“改结点里的箭头”,保留断链前后的路径。
- 树题说明每次调用收到什么、在哪里等待、孩子交回什么;图题给队列、标记表、入度和候选点的变化。
- 完整函数就在题内,代码后按执行顺序解释判断、赋值、循环、函数调用和返回值;类型、头文件和最小可运行程序由第 0 课与章节开头补齐。
- 每题都有可以自己做的小练习和答案;复杂度、证明、考试边界保留,但放到具体例子之后。
六个板块¶
| 板块 | 题数 | 本讲解统一编号 | 阅读入口 |
|---|---|---|---|
| 顺序表 | 15 | 01—15 | 数组移动、去重、双指针、中位数、后缀极值 |
| 链表 | 12 | 16—27 | 改链接、拆分归并、快慢指针 |
| 树 | 14 | 28—41 | 递归含义、层序、WPL、构建与转换 |
| 图 | 11 | 42—52 | 暴力是什么、DFS/BFS、度数、Floyd、拓扑 |
| 查找 | 4 | 53—56 | 二分、BST、顺序树、平衡判断 |
| 排序 | 3 | 57—59 | 快排、归并排序、快速选择 |
统一编号方便跨章节提问;每题标题同时保留原稿章内编号,例如“44|输出有向图全部根(本章第 3 题)”。
每题直达¶
顺序表¶
- 01 有序插入 x
- 02 尾元素覆盖首次最小值
- 03 循环左移
- 04 无序去重
- 05 有序去重
- 06 众数及频次
- 07 主元素
- 08 最小缺失正整数
- 09 合并为升序
- 10 合并为降序
- 11 三序列公共元素
- 12 最小三元组距离
- 13 两等长序列下中位数
- 14 按符号分区
- 15 后缀最大乘积
链表¶
- 16 原地逆置
- 17 最小结点的交换与删后继
- 18 有序链表去重
- 19 绝对值去重
- 20 正负稳定拆分
- 21 a 正序、b 逆序拆分
- 22 原地有序归并
- 23 去重并集
- 24 公共后缀
- 25 倒数第 k 个
- 26 首尾交替重排
- 27 判环
树¶
- 28 正则二叉树
- 29 表达式树转中缀
- 30 表达式树求值
- 31 根到叶路径
- 32 parent 与结点到根路径
- 33 最近公共祖先
- 34 层序求高度
- 35 WPL
- 36 宽度
- 37 满二叉树
- 38 满树先后序互转
- 39 遍历序列建树
- 40 链式与顺序存储互转
- 41 顺序树叶子计数
图¶
- 42 BFS 最远顶点
- 43 有向可达性
- 44 枚举所有根
- 45 EL 路径
- 46 K 顶点
- 47 邻接表度数统计
- 48 无向图判树
- 49 Floyd
- 50 邻接表拓扑判环
- 51 邻接矩阵拓扑判环
- 52 唯一拓扑序
查找与排序¶
怎么用这份讲解¶
第一遍先不要背代码。先读题意,用纸画出输入,再沿状态表做一轮;对照完整函数,问“这一句改变了哪个变量或哪个格子”。看不懂符号时回第 0 课。能跟着做完之后,遮住答案做题末的小练习,检查自己是否会判断下一步。
第二遍再尝试不看讲解说出:变量分别记录什么;本轮为什么可以跳过或删除这个候选;循环在哪里停、答案从哪里交回。然后读末尾速查中的正确性、复杂度和考试边界。不会解释某句,就停在那一句的小例子,不需要靠多抄十遍跳过去。
不要把“暴力→优化”当作每题都必须套的格式。无序查最小值本来就要看全部元素;单次图遍历往往已经合适。真正要学的是有序性、值域、链式连接、递归返回值这些条件如何减少重复工作。
来源、口径与文件边界¶
- 主代码:408-Code59/result.md
- 原书块:408-Code59/source.json · 公开版本与回源索引
- 原 PDF:408代码重点59题(必背).pdf(原 PDF;按下方页码和 block 核验,本页不提供下载)
- 版本依据:版本锁.json · 公开版本与回源索引,bundle 为
breakdown_912DC8FB_20260813_155215。 - 页码来自 source 的实际 page 字段;block 只在 Code59 这本书内解释,不跨书复用。原 PDF 部分代码已有校订,讲解以锁定校订实现说明算法,并明确提醒原稿差异,不把新增优化伪称为原书代码。
- 复杂度按教材抽象算法计,输出、递归栈另作说明;正式片段的定长数组须满足 MAXSIZE 容量。通用工程中的分配失败、非法输入、溢出、栈限制不默认已经处理。
- 本地讲解与网页发布共用这八份源文件;正式稿与版本锁保持只读。题干的重述、校订边界和新增示例均不反向改写原书。
校验记录¶
2026-09-14 零基础版扩写完成后,重新执行以下检查:
- 8 份 Markdown(本目录、零基础第 0 课、6 章),题目编号 01—59 连续、不重不漏;各章数量为 15、12、14、11、4、3。
- 59 题均有新增的初学者题意、变量说明、状态推演、完整函数、逐句解释及自测,并保留原有复杂度、边界、回源;143 个本地链接及目标锚点检查通过,164 处 block 引用均在 Code59 原书块中存在。
- 题内 67 个主代码块逐块与对应正式题目比较,内容一致;第 59 题另外附上的 partition 依赖也与正式函数一致。没有把为方便讲解想象的变量名混入复制代码。
- 从锁定正式稿提取的 72 个 C 代码块(包含结构定义与辅助函数)补齐标准头文件后,通过
clang -std=c11 -Wall -Wextra -Werror -fsyntax-only检查;没有改写这些代码块。 - 用正式函数进行 5,000 轮固定种子的随机测试:等长数组下中位数与排序结果对照;三元组距离与全组合枚举对照;后缀乘积与逐项枚举对照;去重、众数、主元素、缺失正整数、循环移位与排序检查;快速选择分组与穷举划分的最优和差对照。
- 链表对 0—30 个结点检查逆置、奇偶长度重排、无环及成环情况,另检查最小结点处理、绝对值去重、稳定拆分、有序归并、去重并集和公共后缀。树部分检查正则/满、层高/宽度、WPL、BST/AVL、遍历转换及建树样例。
- 穷举全部 4,096 个四顶点无自环简单有向图,将两种拓扑判环及唯一性结果与独立枚举拓扑序的结果比较;另检查度数、DFS/BFS 可达性一致性和 EL/Floyd 样例。全部所选运行检查通过,AddressSanitizer 与 UndefinedBehaviorSanitizer 未报告运行错误。
- 新增教学样例另做运行核对:插入 x=3、三次逆置、末段众数、恰好半数不是主元素、缺失正整数、负数后缀乘积、奇数段下中位数、快速选择分区中间状态;公共元素、括号表达式、根到叶路径、parent 向根路径、全部图根和 K 顶点还逐项对比了真实打印内容。第 0 课的完整 main 示例编译运行,输出为 2。
- 校验结束,正式
result.md与source.json的 SHA-256 仍与版本锁相同。
验证边界:语法检查覆盖提取的全部代码块,但运行测试是上述所选函数和输入,并未逐一穷尽 59 题所有输入,也未系统测试内存分配失败、大数溢出、超容量、非法树/图结构。讲解中已把这些前提与工程边界单列,不把通过测试写成无条件正确。