LeetCode-Go 仓库深度解析:用 Go 语言构建 LeetCode 题解体系、算法分类与实战模板
【免费下载链接】LeetCode-Go✅ Solutions to LeetCode by Go, 100% test coverage, runtime beats 100% | LeetCode 题解项目地址: https://gitcode.com/GitHub_Trending/le/LeetCode-Go
本指南以 README.md 为骨架,系统梳理 LeetCode-Go 这一 Go 语言 LeetCode 题解仓库的整体架构:它如何按题号组织 787+ 道带完整测试的题解、如何用"数据结构 + 算法"两大知识分类表串联 2444 道题、以及仓库中沉淀的双指针、二分查找、回溯、位运算、并查集、线段树等可直接复用的模板代码。读完本文,你既能掌握该仓库的阅读与检索方法,也能把这些模板直接迁移到自己的刷题与面试准备流程中。
一、项目定位:Go 实现的 LeetCode 题解库
LeetCode 是一个包含大量算法题目的在线评测网站,其中大部分是 Google、Facebook、LinkedIn、Apple 等公司真实的面试题。本仓库(LeetCode-Go)用Go 语言给出这些题目的解法,代码风格严格遵循 Google Golang Style Guide(即 Go 官方的 CodeReviewComments 约定)。README 同时提供了英文版 README.md 与中文版 README_zh.md 两份入口文档。
围绕题解代码,仓库还沉淀了一套完整的学习资料:
- 在线电子书《LeetCode Cookbook》:支持 Progressive Web App(PWA)与 Dark Mode(深色模式),可在浏览器中直接阅读;
- 离线PDF 版本:可从 Releases 下载,便于无网络环境下学习;
- PWA 版本:通过 iOS / Android 浏览器即可安装到设备桌面,随时学习。
仓库首页的 logo.png 与 website/static/wechat-qr-code.png 展示了项目的视觉标识与配套社区渠道(详见仓库根目录)。
二、仓库结构:从根目录到每一道题的组织方式
从源码结构看,仓库遵循"一个题目一个目录"的扁平化组织原则:
- leetcode/:题解主体目录,按
题号.题目名命名,例如 leetcode/0001.Two-Sum。每个题目目录通常包含 3 个文件:题号. 题目名.go(题解实现)、题号. 题目名_test.go(单元测试)、README.md(题目讲解); - structures/:公共数据结构包,提供链表、二叉树、堆、栈、队列、区间、点、优先队列、嵌套整数等刷题常用结构的定义与测试工具;
- template/:算法模板包,README 中明确提到的 template/UnionFind.go 即并查集模板所在位置;
- ctl/:辅助工具链目录(含 main.go、command.go、config.go、pdf.go 等),从源码结构看,用于生成/刷新题解元数据、统计与 PDF 等周边能力;
- gotest.sh:一键生成覆盖率文件的脚本;
- go.mod:模块声明与依赖管理。
其中 go.mod 声明了模块名github.com/halfrost/LeetCode-Go、Go 版本1.19,并通过三条 replace 指令将structures、template、ctl/util、ctl/models作为本地子模块引用;依赖包括spf13/cobra(CLI 框架)、BurntSushi/toml(配置文件解析)、mozillazg/request(HTTP 请求)等。这套组织方式让"题解代码"与"可复用的数据结构/模板"解耦,后者可以独立演进。
三、数据结构专题分类:19 大专题与数据结构变种
README 的Data Structures章节给出了一个"专题完成度清单":标注 ✅ 的专题表示其中所有题目已经完成,未标注的表示仍有题目待解:
- Array(数组)
- String(字符串)
- ✅ Two Pointers(双指针)
- ✅ Linked List(链表)
- ✅ Stack(栈)
- Tree(树)
- Dynamic programming(动态规划)
- ✅ Backtracking(回溯)
- Depth First Search(深度优先搜索)
- Breadth First Search(广度优先搜索)
- Binary Search(二分查找)
- Math(数学)
- Hash Table(哈希表)
- ✅ Sort(排序)
- ✅ Bit Manipulation(位运算)
- ✅ Union Find(并查集)
- ✅ Sliding Window(滑动窗口)
- ✅ Segment Tree(线段树)
- ✅ Binary Indexed Tree(树状数组)
数据结构及其变种对照表
README 用一张表梳理了计算机核心数据结构及其常见变种,是构建算法知识体系的索引:
| 数据结构 | 变种 |
|---|---|
| 顺序线性表:向量 | |
| 单链表 | 1. 双向链表 2. 静态链表 3. 对称矩阵 4. 稀疏矩阵 |
| 哈希表 | 1. 散列函数 2. 解决碰撞/填充因子 |
| 栈和队列 | 1. 广义栈 2. 双端队列 |
| 队列 | 1. 链表实现 2. 循环数组实现 3. 双端队列 |
| 字符串 | 1. KMP 算法 2. 有限状态自动机 3. 模式匹配有限状态自动机 4. BM 模式匹配算法 5. BM-KMP 算法 6. BF 算法 |
| 树 | 1. 二叉树 2. 并查集 3. Huffman 树 |
| 数组实现的堆 | 1. 极大堆和极小堆 2. 极大极小堆 3. 双端堆 4. d 叉堆 |
| 树实现的堆 | 1. 左堆 2. 扁堆 3. 二项式堆 4. 斐波那契堆 5. 配对堆 |
| 查找 | 1. 哈希表 2. 跳跃表 3. 排序二叉树 4. AVL 树 5. B 树 / B+ 树 / B* 树 6. AA 树 7. 红黑树 8. 排序二叉堆 9. Splay 树 10. 双链树 11. Trie 树 12. R 树 |
仓库中的数据结构实现佐证
上述专题的落地方案集中在 structures/ 包中,其代码本身就是"刷题基础设施"的范例:
- structures/ListNode.go:定义
ListNode{Val, Next},并提供List2Ints(链表转数组,带 100 层深度上限防环 panic)、Ints2List(数组建链表)、GetNodeWith(按值取节点)、Ints2ListWithCycle(构造带环链表,pos=-1表示无环)等测试辅助函数; - structures/TreeNode.go:定义
TreeNode{Val, Left, Right},提供NULL哨兵常量、Ints2TreeNode(按层序数组建树)、PreIn2Tree/InPost2Tree(由前序+中序 / 中序+后序还原二叉树)、Tree2Preorder/Inorder/Postorder(三种遍历转切片)、Tree2ints(层序还原)、Strings2TreeNode(支持 "null" 字符串输入)等; - 此外还有 Heap.go、Stack.go、Queue.go、Interval.go、Point.go、PriorityQueue.go、NestedInteger.go 等,且每个结构都配了对应的
_test.go文件(如 structures/ListNode_test.go、structures/TreeNode_test.go)。
刷题时直接复用这套结构,可以省去大量"造数据"的样板代码。
四、算法专题分类:从排序到 NP 完全的知识地图
README 的Algorithm章节用一张大表把算法体系分成 11 大类,并逐一列出具体类型与相关题目,是仓库"以题带学"的理论底座:
| 算法 | 具体类型(节选完整列表) |
|---|---|
| 排序算法 | 1. 冒泡排序 2. 插入排序 3. 选择排序 4. 希尔 Shell 排序 5. 快速排序 6. 归并排序 7. 堆排序 8. 线性排序算法 9. 自省排序 10. 间接排序 11. 计数排序 12. 基数排序 13. 桶排序 14. 外部排序- k 路归并败者树 15. 外部排序- 最佳归并树 |
| 递归与分治 | 1. 二分搜索/查找 2. 大整数的乘法 3. Strassen 矩阵乘法 4. 棋盘覆盖 5. 合并排序 6. 快速排序 7. 线性时间选择 8. 最接近点对问题 9. 循环赛日程表 |
| 动态规划 | 1. 矩阵连乘问题 2. 最长公共子序列 3. 最大子段和 4. 凸多边形最优三角剖分 5. 多边形游戏 6. 图像压缩 7. 电路布线 8. 流水作业调度 9. 0-1 背包问题/背包九讲 10. 最优二叉搜索树 11. 动态规划加速原理 12. 树型 DP |
| 贪心 | 1. 活动安排问题 2. 最优装载 3. 哈夫曼编码 4. 单源最短路径 5. 最小生成树 6. 多机调度问题 |
| 回溯法 | 1. 装载问题 2. 批处理作业调度 3. 符号三角形问题 4. n 后问题 5. 0-1 背包问题 6. 最大团问题 7. 图的 m 着色问题 8. 旅行售货员问题 9. 圆排列问题 10. 电路板排列问题 11. 连续邮资问题 |
| 搜索 | 1. 枚举 2. DFS 3. BFS 4. 启发式搜索 |
| 随机化 | 1. 随机数 2. 数值随机化算法 3. Sherwood 舍伍德算法 4. Las Vegas 拉斯维加斯算法 5. Monte Carlo 蒙特卡罗算法(相关题目:计算 π 值、定积分、解非线性方程组、线性时间选择、跳跃表、n 后问题、整数因子分解、主元素问题、素数测试) |
| 图论 | 遍历 DFS/BFS、AOV/AOE 网络、Kruskal/Prim/Boruvka(最小生成树)、Dijkstra/Bellman-Ford/SPFA/Floyd/Johnson(最短路)、Fleury(欧拉回路)、Ford-Fulkerson/Edmonds-Karp/Dinic/预流推进/HLPP(最大流)、Primal-Dual(最小费用流)、Kosaraju/Tarjan/Gabow(强连通分量)、匈牙利/Hopcroft-Karp/KM(二分图匹配)、Edmonds Blossom(一般图匹配),以及图遍历、连通性、割点/割边、拓扑排序、关键路径、次小生成树、K 短路、最大流、最小费用流、图着色、差分约束、欧拉回路、中国邮递员、汉密尔顿回路、边/点割集、路径覆盖、二分图完美匹配、仙人掌图、弦图、稳定婚姻、最大团等 20 类相关问题 |
| 数论 | 最大公约数、最小公倍数、分解质因数、素数判定、进制转换、高精度计算、整除问题、同余问题、欧拉函数、扩展欧几里得、置换群、母函数、离散变换、康托展开、矩阵、向量、线性方程组、线性规划 |
| 几何 | 1. 凸包- Gift wrapping 2. 凸包- Graham scan 3. 线段问题 4. 多边形和多面体相关问题 |
| NP 完全 | 计算模型(RAM/RASP/图灵机/非确定性图灵机)、P 类与 NP 类语言、多项式时间验证/变换、Cook 定理、CNF-SAT / 3-SAT、团问题、顶点覆盖、子集和问题、哈密顿回路、TSP 及其近似算法、集合覆盖近似、指数时间算法、多项式时间近似格式等 |
这张表与"数据结构变种表"合在一起,构成了完整的计算机算法理论索引——每学到一类算法,都能在仓库中找到对应的题目进行实战验证。
五、题解目录与个人数据统计
个人数据
README 的Personal Stats表格记录了作者在 LeetCode 上的刷题进度与质量指标:
| 指标 | Easy | Medium | Hard | Total |
|---|---|---|---|---|
| Optimizing(优化中) | 31 | 78 | 43 | 152 |
| Accepted(已通过) | 287 | 484 | 142 | 913 |
| Total(总题数) | 600 | 1305 | 539 | 2444 |
| Perfection Rate(优化完成率) | 89.2% | 83.9% | 69.7% | 83.4% |
| Completion Rate(完成率) | 47.8% | 37.1% | 26.3% | 37.4% |
仓库当前已收录787 道题的题解,另有 11 道题仍在向 runtime beats 100% 优化(README 明确说明这一状态)。
目录表的组织方式
Directory章节按题号递增排列每一道题,每行包含No.(题号)、Title(题目名)、Solution(Go 题解目录链接)、Acceptance(通过率)、Difficulty(难度)、Frequency(频率)六个字段。完整 787 行表格在 README.md 的 "2. Directory" 小节中,例如开头几行为:
| No. | Title | Acceptance | Difficulty |
|---|---|---|---|
| 0001 | Two Sum | 49.1% | Easy |
| 0002 | Add Two Numbers | 39.7% | Medium |
| 0003 | Longest Substring Without Repeating Characters | 33.8% | Medium |
| 0004 | Median of Two Sorted Arrays | 35.1% | Hard |
| 0005 | Longest Palindromic Substring | 32.4% | Medium |
表中已提供题解链接的题目(如 leetcode/0001.Two-Sum)可直接跳转到对应目录阅读 Go 实现与测试;未提供链接的题目表示目前还没有 Go 题解(README 末尾明确标注 "The following are free problems that don't have a Go solution yet: None",即目录中的未收录题不属于仓库范围)。
单题目录的源码示例:0001.Two-Sum
以 leetcode/0001.Two-Sum/1. Two Sum.go 为例,经典两数之和使用哈希表一趟扫描实现:
package leetcode func twoSum(nums []int, target int) []int { m := make(map[int]int) for k, v := range nums { if idx, ok := m[target-v]; ok { return []int{idx, k} } m[v] = k } return nil }对应的测试文件 leetcode/0001.Two-Sum/1. Two Sum_test.go 展示了本仓库统一的测试范式:定义para1(参数)与ans1(答案)结构体,组成question1用例切片,逐条打印输入输出并调用被测函数。这种"表格驱动 + 打印对照"的风格贯穿所有题目,既方便在本地验证,也方便肉眼核对边界用例(如[]int{0, 3}, 5期望空结果)。
六、分类实战要点:可直接复用的模板代码
README 的Categories章节按专题给出了一线实战要点与代码模板,这是全文技术含量最高的部分,以下完整呈现。
6.1 Two Pointers(双指针)与滑动窗口
经典双指针滑动窗口模式:右指针不断右移直到无法移动(具体条件因题而异),右指针到达最右端后再移动左指针释放窗口左边界。适用于 3、76、209、424、438、567、713、763、845、881、904、978、992、1004、1040、1052 等题目。
left, right := 0, -1 for left < len(s) { if right+1 < len(s) && freq[s[right+1]-'a'] == 0 { freq[s[right+1]-'a']++ right++ } else { freq[s[left]-'a']-- left++ } result = max(result, right-left+1) }此外:快慢指针可在 O(n) 内找到重复数(287);"替换后最长重复字符"(424);以及 SUM 问题集(1、15、16、18、167、923、1074)。
6.2 Linked List(链表)
- 巧妙引入 dummy 头节点,让遍历逻辑更统一;
- 灵活使用递归:设对递归条件,代码会非常优雅;但注意部分题目不能用递归(递归过深会导致 TLE 和栈溢出);
- 链表区间反转(92);找中间节点(876)、找倒数第 n 个节点(19)一趟即可;
- 合并 K 个有序链表(21、23);
- 链表分区/分组(86、328);
- O(n·log n) 时间、O(1) 空间排序链表,只有一种方案:自顶向下归并排序(148);
- 判断链表是否有环并输出环入口下标、判断两链表是否相交并输出交点(141、142、160)。
6.3 Stack(栈)
- 括号匹配类(20、921、1021);
- 基础出入栈操作(71、150、155、224、225、232、946、1047);
- 用栈做编解码(394、682、856、880);
- 单调栈:用栈维护单调递增或递减的下标数组(84、456、496、503、739、901、907、1019)。
6.4 Backtracking(回溯)与 DFS 模板
- 排列问题(46、47、60、526、996);组合问题(39、40、77、216);排列组合混合(1079);
- N 皇后终极位运算解法(51、52);数独(37);
- 四方向搜索(79、212、980);子集问题(78、90);
- Trie(208、211);BFS 优化(126、127)。
README 给出了可复用的 DFS 模板(以组合总和 II 去重为例):
func combinationSum2(candidates []int, target int) [][]int { if len(candidates) == 0 { return [][]int{} } c, res := []int{}, [][]int{} sort.Ints(candidates) findcombinationSum2(candidates, target, 0, c, &res) return res } func findcombinationSum2(nums []int, target, index int, c []int, res *[][]int) { if target == 0 { b := make([]int, len(c)) copy(b, c) *res = append(*res, b) return } for i := index; i < len(nums); i++ { if i > index && nums[i] == nums[i-1] { // this is the key de-duplication logic continue } if target >= nums[i] { c = append(c, nums[i]) findcombinationSum2(nums, target-nums[i], i+1, c, res) c = c[:len(c)-1] } } }以及 BFS 模板(以 01 矩阵分层扩展为例):
func updateMatrix_BFS(matrix [][]int) [][]int { res := make([][]int, len(matrix)) if len(matrix) == 0 || len(matrix[0]) == 0 { return res } queue := make([][]int, 0) for i, _ := range matrix { res[i] = make([]int, len(matrix[0])) for j, _ := range res[i] { if matrix[i][j] == 0 { res[i][j] = -1 queue = append(queue, []int{i, j}) } } } level := 1 for len(queue) > 0 { size := len(queue) for size > 0 { size -= 1 node := queue[0] queue = queue[1:] i, j := node[0], node[1] for _, direction := range [][]int{{-1, 0}, {1, 0}, {0, 1}, {0, -1}} { x := i + direction[0] y := j + direction[1] if x < 0 || x >= len(matrix) || y < 0 || y >= len(matrix[0]) || res[x][y] < 0 || res[x][y] > 0 { continue } res[x][y] = level queue = append(queue, []int{x, y}) } } level++ } for i, row := range res { for j, cell := range row { if cell == -1 { res[i][j] = 0 } } } return res }6.5 Binary Search(二分查找)
经典二分有三个易错点:循环退出条件是low <= high而非low < high;mid 用low + (high-low)>>1防溢出;更新边界是low = mid + 1、high = mid - 1:
func binarySearchMatrix(nums []int, target int) int { low, high := 0, len(nums)-1 for low <= high { mid := low + (high-low)>>1 if nums[mid] == target { return mid } else if nums[mid] > target { high = mid - 1 } else { low = mid + 1 } } return -1 }二分查找有 4 个基本变体:找第一个等于 target 的元素、找最后一个等于 target 的元素、找第一个 ≥ target 的元素、找最后一个 ≤ target 的元素,均为 O(log n)。完整模板:
// Binary-search for the first element equal to target, O(log n) func searchFirstEqualElement(nums []int, target int) int { low, high := 0, len(nums)-1 for low <= high { mid := low + ((high - low) >> 1) if nums[mid] > target { high = mid - 1 } else if nums[mid] < target { low = mid + 1 } else { if (mid == 0) || (nums[mid-1] != target) { // found the first element equal to target return mid } high = mid - 1 } } return -1 } // Binary-search for the last element equal to target, O(log n) func searchLastEqualElement(nums []int, target int) int { low, high := 0, len(nums)-1 for low <= high { mid := low + ((high - low) >> 1) if nums[mid] > target { high = mid - 1 } else if nums[mid] < target { low = mid + 1 } else { if (mid == len(nums)-1) || (nums[mid+1] != target) { // found the last element equal to target return mid } low = mid + 1 } } return -1 } // Binary-search for the first element >= target, O(log n) func searchFirstGreaterElement(nums []int, target int) int { low, high := 0, len(nums)-1 for low <= high { mid := low + ((high - low) >> 1) if nums[mid] >= target { if (mid == 0) || (nums[mid-1] < target) { // found the first element >= target return mid } high = mid - 1 } else { low = mid + 1 } } return -1 } // Binary-search for the last element <= target, O(log n) func searchLastLessElement(nums []int, target int) int { low, high := 0, len(nums)-1 for low <= high { mid := low + ((high - low) >> 1) if nums[mid] <= target { if (mid == len(nums)-1) || (nums[mid+1] > target) { // found the last element <= target return mid } low = mid + 1 } else { high = mid - 1 } } return -1 }"大部分有序数组"上的二分(经典与变体均适用):找山脉数组的峰顶、找旋转排序数组的旋转点,见 33、81、153、154、162、852:
func peakIndexInMountainArray(A []int) int { low, high := 0, len(A)-1 for low < high { mid := low + (high-low)>>1 // if mid is larger, a peak lies on the left, so high = mid; if mid+1 is larger, a peak lies on the right, so low = mid + 1 if A[mid] > A[mid+1] { high = mid } else { low = mid + 1 } } return low }"最大最小化"(minimize-the-maximum)类问题:在满足约束的前提下尽量收紧上限,见 410、875、1011、1283。
6.6 Sort(排序)与 Bit Manipulation(位运算)
排序专题要点:多路快排(75);链表插入排序(147)与归并排序(148);桶排序与基数排序(164);摆动排序(324);相邻元素去重重排(767、1054);煎饼排序(969)。
位运算专题给出了 XOR 性质的速查表:
x ^ 0 = x x ^ 11111……1111 = ~x x ^ (~x) = 11111……1111 x ^ x = 0 a ^ b = c => a ^ c = b => b ^ c = a (commutativity) a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c (associativity)构造特殊掩码将指定位清零或置一:
Clear the rightmost n bits of x: x & (~0 << n) Get the n-th bit of x (0 or 1): (x >> n) & 1 Get the n-th bit of x as its power-of-two value: x & (1 << (n - 1)) Set only the n-th bit to 1: x | (1 << n) Set only the n-th bit to 0: x & (~(1 << n)) Clear x's bits from the most significant bit down to the n-th bit (inclusive): x & ((1 << n) - 1) Clear the bits from the n-th bit down to bit 0 (inclusive): x & (~((1 << (n + 1)) - 1))按位与的特殊技巧(260、201、318、371、397、461、693):
X & 1 == 1 tests whether X is odd (otherwise even) X &= (X - 1) clears the lowest set bit (LSB) X & -X isolates the lowest set bit (LSB) X & ~X = 06.7 Union Find(并查集)
- 仓库在 template/UnionFind.go 提供并查集模板,含两种实现:一种是"路径压缩 + 按秩合并",另一种是"维护集合大小 + 最大集合大小",各有适用场景。前者适用 128、130、547、684、721、765、778、839、924、928、947、952、959、990;后者适用 803、952——尤其 803 题对时间敏感,不做按秩合并与集合计数优化会 TLE;
- 并查集是一种"思想":有些题需灵活套用而非照搬模板,如 399 的 stringUnionFind,用字符串做键、用 map 代替整数节点 ID;
- 有些题不能盲目套模板:如 685 因涉及有向图、需要保留每个节点的前驱,不能使用路径压缩与按秩合并;
- 抽象信息后合理编号,用 map 降复杂度:如 721、959;
- 地图/砖块/网格类题目可创建特殊节点,把所有边界砖块或格子 union 到它身上:130、803;
- 能用并查集解的题一般 DFS/BFS 也能解,只是时间复杂度略高。
6.8 Segment Tree(线段树)与 Binary Indexed Tree(树状数组)
线段树专题要点:
- 经典数组实现线段树:抽象出 pushUp 合并逻辑,可支持任意操作(常用加法、最大值、最小值等),适用 218、303、307、699;
- 经典计数线段树:315、327、493;
- 指针(树)实现:715、732;懒区间更新:218、699;
- 离散化(坐标压缩)的特殊坑:若三个区间为 [1,10]、[1,4]、[6,10],离散化后 x[1]=1、x[2]=4、x[3]=6、x[4]=10,则区间一变为 [1,4]、区间二 [1,2]、区间三 [3,4],此时"区间一 = 区间二 + 区间三",与原模型矛盾(离散化前区间一明显大于二者之和)。正确做法是在差值大于 1 的两个值之间补插一个值,例如在 1、4、6、10 之间插入 5,得到 x[1]=1、x[2]=4、x[3]=5、x[4]=6、x[5]=10,此后区间一为 1-5、区间二为 1-2、区间三为 4-5;
- 灵活建树:一个节点可存多条信息,pushUp 的合并形式多样,适用 850、1157。
线段树按难度递进的题型序列(README 完整列出):
- 点更新:HDU 1166(点加减 + 区间和)、HDU 1754(点赋值 + 区间最值)、HDU 1394(点加减 + 区间和)、HDU 2795(查询区间最大值位置,更新并入查询);
- 区间更新:HDU 1698(区间赋值,整体只查一次可直接输出根节点)、POJ 3468(区间加减 + 区间和)、POJ 2528(离散化 + 区间赋值 + 简单哈希)、POJ 3225(区间赋值、区间 XOR + 简单哈希);
- 区间合并(求满足条件的最长连续区间,pushUp 需合并左右孩子区间):POJ 3667;
- 扫描线(对操作排序后从左到右扫描,典型是矩形面积并、周长并):HDU 1542 Atlantis(区间加减 + 直接读根节点)、HDU 1828 Picture(区间加减 + 直接读根节点)。
Binary Indexed Tree(树状数组)作为专题已全部完成,相关题目与讲解文章入口见 README 的 Categories 章节。
七、工程化支撑:测试、覆盖率与本地运行
本仓库不是一个"纯文档项目",代码质量通过测试与覆盖率来保证:
- gotest.sh 使用 Go 1.10+ 支持的"多包一次性 -coverprofile"写法,直接产出单一合法的覆盖率文件,避免旧写法(逐包 cat 追加)产生多行
mode: atomic头、被新版 Codecov 解析器判为 0% 的问题:
go test -covermode=atomic -coverprofile=coverage.txt ./leetcode/...- 仓库根目录的 coverage.txt 即该命令的产物,配合 CI(Go Test / Deploy 工作流)持续验证全部题解;
- 每个题目目录下的
_test.go采用统一的"para/ans 结构体 + 用例切片"范式(见 leetcode/0001.Two-Sum/1. Two Sum_test.go),新增题目只需复制模板补充用例即可。
本地运行方式(仓库只读,读者可在自己 clone 的副本中执行):
# 运行全部题解测试 go test ./leetcode/... # 生成覆盖率文件 bash gotest.sh八、配套电子书与授权说明
仓库 README 还交代了两项重要信息:
- 《LeetCode Cookbook》电子书:与仓库题解一一对应的在线书籍,支持 PWA 与 Dark Mode,也可下载离线 PDF 版本,或通过 iOS/Android 浏览器将 PWA 版安装到设备桌面随时学习(入口位于仓库 README 顶部);
- License:仓库中的代码(全部 Go 题解)采用 MIT License;书的内容(网站提供的文章与插图)采用 Creative Commons(CC)授权——简言之,代码可自由复用,书面/插图类书籍内容按 CC 共享。
结语
LeetCode-Go 的价值不止于"答案集合":它以 README.md 为索引,把 19 个数据结构专题、11 大算法门类、787+ 道带测试的 Go 题解、可直接复用的双指针/二分/回溯/位运算/并查集/线段树模板,以及 structures 与 template 两个工具包串成了一个自洽的学习闭环。无论是准备面试、复习算法理论,还是寻找 Go 语言的高质量刷题代码范例,都可以按"专题表定位知识 → 目录表定位题目 → 单题目录读实现与测试 → 模板包复用到实战"的路径高效使用这个仓库。
【免费下载链接】LeetCode-Go✅ Solutions to LeetCode by Go, 100% test coverage, runtime beats 100% | LeetCode 题解项目地址: https://gitcode.com/GitHub_Trending/le/LeetCode-Go
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考