1. 刷题笔记的价值与定位
作为一名程序员,刷题是提升算法能力和面试竞争力的必经之路。但很多人在刷题过程中容易陷入"只刷不记"的误区,导致刷过的题目很快遗忘,无法形成长期记忆。这正是刷题笔记存在的意义——它不仅是对解题过程的记录,更是个人知识体系的构建工具。
我个人的刷题笔记始于2020年,至今已积累超过1500道题目的详细解析。在这个过程中,我逐渐形成了自己的笔记方法论。好的刷题笔记应该具备以下特征:
- 可追溯性:每道题都标注日期和来源(如LeetCode题号)
- 可重现性:解题思路清晰到能让未来的自己快速理解
- 可扩展性:留有空间补充后续发现的优化解法和变种题目
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 刷题笔记的标准结构
2.1 题目基本信息记录
每道题目的笔记应该从基础信息开始:
markdown复制# 2026-01-06 刷题记录
## [1. Two Sum](https://leetcode.com/problems/two-sum/)
**难度**:Easy
**标签**:Array, Hash Table
**首次通过**:2026-01-06 10:23
**最佳耗时**:8分钟
**提交次数**:1次
注意:记录首次通过时间和最佳耗时非常重要,这能帮助你追踪自己的进步曲线。我习惯用24小时制记录具体时间,因为不同时段的解题状态可能有显著差异。
2.2 解题思路的层次化表达
不要直接写最终代码,而应该分层次记录思考过程:
- 暴力解法:最先想到的O(n²)双重循环解法
- 优化思路:如何利用哈希表将时间复杂度降到O(n)
- 边界条件:考虑重复元素、空数组等特殊情况
- 语言特性:不同语言实现时的注意事项(如Python字典的key处理)
python复制# 最终优化解法
def twoSum(nums, target):
seen = {}
for i, num in enumerate(nums):
complement = target - num
if complement in seen:
return [seen[complement], i]
seen[num] = i
return []
2.3 复杂度分析的规范写法
规范的复杂度分析应该包含:
- 时间复杂度:最好/最坏/平均情况
- 空间复杂度:额外使用的空间
- 实际测试数据:在LeetCode上的运行时间百分位
示例:
code复制时间复杂度:O(n)
- 最坏情况:遍历整个数组 → O(n)
- 平均情况:解通常在数组前半部分 → O(n/2)
空间复杂度:O(n)
- 哈希表存储n个元素的索引
实测表现:
Runtime: 48 ms (beats 92.15%)
Memory: 15.2 MB (beats 78.33%)
3. 高效刷题笔记方法论
3.1 题目分类体系
我采用三级分类法组织题目:
- 算法大类:排序、搜索、动态规划等
- 解题模式:双指针、滑动窗口、回溯等
- 行业应用:系统设计、数据库优化等
例如Two Sum可以归类为:
code复制Hash Table → 补数查找 → 缓存优化
3.2 错题本的建立与维护
建立错题本时要注意:
- 错误类型标签:逻辑错误、语法错误、边界条件等
- 错误现场保留:第一次出错的代码原样保存
- 错误分析:为什么错?如何发现?怎样避免?
示例记录:
markdown复制## 错误记录
**错误类型**:边界条件遗漏
**错误代码**:
```python
def twoSum(nums, target):
# 遗漏了空数组判断
seen = {}
...
发现过程:提交后测试用例[ [], 0 ]报错
修复方案:在函数开始添加if not nums: return []
code复制
### 3.3 可视化解题思路
对于复杂题目,建议用ASCII图辅助理解:
滑动窗口示例:[a b c d e f]找连续子串
初始窗口:[a] b c d e f
扩展右界:a [b c] d e f → 满足条件
移动左界:a b [c d] e f → 仍满足
最终解:a b [c d e] f
code复制
## 4. 刷题笔记的进阶技巧
### 4.1 题目变种记录
遇到经典题目的变种时,在原题笔记中添加"变种"章节:
```markdown
## 变种题目
1. Three Sum (LeetCode 15)
- 解法:排序+双指针
- 关联:可视为Two Sum的扩展
2. Two Sum II - Input array is sorted (LeetCode 167)
- 解法:双指针法
- 对比:比哈希表解法更优
4.2 代码模板积累
将常见算法整理成可复用的代码模板:
python复制# 二分查找模板
def binary_search(arr, target):
left, right = 0, len(arr)-1
while left <= right:
mid = left + (right-left)//2
if arr[mid] == target:
return mid
elif arr[mid] < target:
left = mid + 1
else:
right = mid - 1
return -1
4.3 性能优化记录
记录同一题目的不同解法性能对比:
| 解法 | 时间复杂度 | 空间复杂度 | LeetCode用时 |
|---|---|---|---|
| 暴力法 | O(n²) | O(1) | 3800ms |
| 哈希表 | O(n) | O(n) | 48ms |
| 双指针 | O(nlogn) | O(1) | 60ms |
5. 刷题笔记的工具链
5.1 笔记工具选型
经过多年实践,我的工具链如下:
- 主力编辑器:VS Code + Markdown插件
- 优点:代码高亮、片段管理
- 版本控制:Git私有仓库
- 每天提交,方便回溯
- 同步方案:GitHub私有仓库+iCloud备份
- 搜索方案:Alfred Workflow快速检索题目
5.2 自动化辅助脚本
我开发了几个提高效率的脚本:
python复制# 自动生成笔记模板
import datetime
def create_note(problem):
date = datetime.datetime.now().strftime("%Y-%m-%d")
template = f"""# {date} 刷题记录
## [{problem['title']}]({problem['url']})
**难度**:{problem['difficulty']}
**标签**:{', '.join(problem['tags'])}
"""
return template
5.3 移动端复习方案
将笔记导出为Anki卡片,利用碎片时间复习:
code复制Front: Two Sum的最优解法时间复杂度?
Back: O(n),使用哈希表存储访问过的元素
6. 长期维护与知识沉淀
6.1 定期复习机制
我采用改良版的艾宾浩斯复习法:
- 新题:当天、1天后、3天后、7天后
- 中等难度:14天后、30天后
- 难题:60天后、90天后
使用Trello看板管理复习进度:
code复制待复习 → 本周复习 → 本月复习 → 季度复习
6.2 知识图谱构建
用Obsidian建立题目间的关联:
code复制Two Sum → 补数概念 → 哈希表应用
→ 变种 → Three Sum
→ 类似题 → 170. Two Sum III
6.3 面试前的快速回顾
面试前一周,我会:
- 按公司标签筛选高频题
- 重做所有"提交次数>1"的题目
- 重点复习动态规划和系统设计笔记
- 整理个人解题模式统计(如滑动窗口正确率)
我的刷题笔记从最初的简单记录,逐渐演变为个人算法知识库。这个过程让我意识到,刷题不是目的,而是手段。真正有价值的是通过笔记构建的可复用知识体系,它会在职业生涯的各个阶段持续产生复利效应。现在回头看三年前的笔记,不仅能看见技术的成长,更能看见思考方式的进化。
