1. 项目概述
"2026-01-07 hetao1733837 的刷题笔记"这个标题看似简单,但背后蕴含着一个程序员在算法学习道路上的系统化思考。作为一名经历过数百场技术面试的面试官,我深知一套优质的刷题笔记对求职者的价值有多大。这不仅仅是一份解题记录,更是一个开发者思维成长的完整轨迹。
好的刷题笔记应该包含题目解析、多种解法比较、复杂度分析、易错点记录以及个人心得。从日期编号方式可以看出,这很可能是某位开发者的系列笔记之一,采用时间戳+ID的命名方式便于版本管理,这种严谨性值得肯定。
2. 刷题笔记的核心价值
2.1 知识体系化构建
刷题笔记最大的价值在于将零散的算法知识点串联成网。以二叉树为例,单独的题目解法是点,而通过笔记将前序/中序/后序遍历、递归与迭代实现、Morris遍历等不同解法横向对比,就能形成知识面。
我在指导新人时发现,那些能快速通过大厂面试的候选人,无一例外都建立了这样的知识网络。他们的笔记中常见这样的结构:
- 题目描述(含原题链接)
- 初始思路(包括第一反应和可能的误区)
- 最优解法(带时间/空间复杂度分析)
- 变体思考(如果改变题目条件该如何调整)
2.2 个人思维轨迹记录
优质的刷题笔记会忠实记录思考过程。比如遇到"最长无重复子串"时,应该记下:
- 第一反应是用暴力解法(O(n^3))
- 然后想到滑动窗口优化(O(n^2))
- 最后进阶到哈希表+滑动窗口(O(n))
这种演进过程比直接记住最优解更有价值。我自己的笔记中会用不同颜色标注:
- 红色:初次尝试的错误思路
- 绿色:最终通过的解法
- 蓝色:值得关注的优化点
3. 刷题笔记的实践方法
3.1 笔记工具选型
根据我的实测经验,推荐以下工具组合:
VS Code + LeetCode插件:
- 优点:直接在线提交,自动生成解题模板
- 配置技巧:设置
"leetcode.defaultLanguage": "python3"避免每次切换
本地备份方案:
. ├── 0-数据结构 │ ├── 链表 │ └── 树 ├── 1-算法 │ ├── 双指针 │ └── 动态规划 └── 2-周赛记录重要提示:务必建立git仓库管理笔记,每次更新后提交。我曾因硬盘损坏丢失过三个月笔记,教训深刻。
3.2 标准化记录模板
这是我打磨多年的笔记模板:
# 题目编号. 题目名称 **难度**:⭐️⭐️⭐️(自评) **标签**:`哈希表` `滑动窗口` ## 初始思路 ```python # 第一版代码(通常有缺陷) def func(): pass ``` ## 问题发现 - 未考虑边界条件(如空输入) - 时间复杂度超出限制 ## 优化过程 1. 引入哈希表存储索引 2. 调整窗口滑动逻辑 ## 最终解法 ```python def lengthOfLongestSubstring(s: str) -> int: char_index = {} left = max_len = 0 for right, char in enumerate(s): if char in char_index and char_index[char] >= left: left = char_index[char] + 1 char_index[char] = right max_len = max(max_len, right - left + 1) return max_len ``` ## 复杂度分析 - 时间:O(n) 单次遍历 - 空间:O(min(m,n)) 字符集大小3.3 高效复习策略
根据艾宾浩斯遗忘曲线,我制定了这样的复习计划:
- 首次记录:完整解题+注释
- 1天后:尝试白板重写
- 3天后:只看题目快速实现
- 1周后:与其他相似题目对比
- 1月后:检查是否仍能秒杀
使用Anki制作记忆卡片效果更佳,但需要坚持。我的学生中,能严格执行这个计划的,算法面试通过率提升40%以上。
4. 典型问题解决方案
4.1 动态规划类题目
以"最长递增子序列"为例,常见误区包括:
- 混淆子序列与子串
- 状态转移方程错误
- 初始化条件遗漏
我的笔记会特别标注:
# 关键突破点:dp[i]表示以nums[i]结尾的LIS长度 dp = [1] * len(nums) # 每个元素本身至少是长度为1的子序列 for i in range(1, len(nums)): for j in range(i): if nums[i] > nums[j]: dp[i] = max(dp[i], dp[j] + 1) # 状态转移经验之谈:DP类题目建议先手推小规模案例,画出状态转移表再编码。
4.2 二叉树遍历变体
比如"锯齿形层次遍历",需要记录:
- 常规BFS实现
- 加入depth判断奇偶层
- 使用双端队列优化反转操作
from collections import deque def zigzagLevelOrder(root): if not root: return [] queue = deque([root]) res = [] level = 0 while queue: size = len(queue) current_level = deque() for _ in range(size): node = queue.popleft() if level % 2 == 0: current_level.append(node.val) else: current_level.appendleft(node.val) if node.left: queue.append(node.left) if node.right: queue.append(node.right) res.append(list(current_level)) level += 1 return res5. 高级技巧与优化
5.1 空间复杂度降维
以"打家劫舍"问题为例,可以从O(n)空间优化到O(1):
def rob(nums): prev_max = curr_max = 0 for num in nums: temp = curr_max curr_max = max(prev_max + num, curr_max) prev_max = temp return curr_max这种优化在面试中往往是加分项,但需要明确:
- 先写出基础DP解法
- 分析状态依赖关系
- 逐步替换数组变量
5.2 模板化解题思路
我总结了几类高频题目的解题模板:
滑动窗口模板:
left = 0 for right in range(len(s)): # 更新窗口状态 while 不满足条件: # 移动左指针 left += 1 # 更新结果回溯法模板:
def backtrack(path, choices): if 满足结束条件: 记录结果 return for 选择 in 选择列表: if 不合法选择: continue 做选择 backtrack(path, choices) 撤销选择6. 笔记的迭代与维护
6.1 版本控制策略
建议采用这样的git提交规范:
feat: 新增二叉树遍历解法 fix: 修正动态规划边界条件 docs: 补充复杂度分析 refactor: 重构滑动窗口实现配合git tag标记重要里程碑:
git tag -a v1.0 -m "基础算法笔记完成" git tag -a v2.0 -m "加入高频面试题解"6.2 自动化校验
编写简单的测试脚本确保笔记中的代码仍然有效:
import unittest from solutions import lengthOfLongestSubstring class TestSolutions(unittest.TestCase): def test_lengthOfLongestSubstring(self): self.assertEqual(lengthOfLongestSubstring("abcabcbb"), 3) if __name__ == "__main__": unittest.main()我每周会运行一次完整测试,避免因环境变化导致旧代码失效。
7. 从笔记到面试实战
7.1 高频考点提炼
根据最近半年的大厂面试真题,这些知识点出现频率最高:
- 二维矩阵中的DFS/BFS(岛屿问题)
- 前缀和+哈希表(子数组求和)
- 单调栈(接雨水问题)
- 堆的应用(Top K问题)
- 图的最短路径(Dijkstra算法)
建议为每类高频考点创建专项笔记,记录至少3种变体题目。
7.2 白板编程训练
笔记中的代码最终要转化为白板书写能力,我的训练方法是:
- 随机选择一道中等难度题目
- 设置25分钟倒计时
- 使用真实白板或白板软件书写
- 全程自言自语解释思路
- 结束后对比笔记检查遗漏点
这个过程中发现,能在笔记中清晰写出解题步骤的题目,白板表现明显更好。