1. 为什么需要每周刷题记录?
作为一名程序员,我坚持每周记录刷题和学习内容已经三年多了。最初只是随手记几笔,后来发现这个习惯带来的复利效应远超预期。每周记录不仅是对学习成果的梳理,更是建立个人知识体系的脚手架。
最直接的收益是避免"狗熊掰棒子"式的学习。我们常常遇到这种情况:花大力气搞懂某个算法,两周后遇到类似题目又束手无策。通过每周记录关键解题思路和易错点,相当于给自己的大脑建立了外挂存储器。
建议记录时采用"问题描述+核心思路+代码片段+反思总结"的四段式结构,这样后期回顾时能最快唤醒记忆。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 我的第三周刷题复盘模板
2.1 题目分类统计
本周共完成15道题目,类型分布如下:
| 题型 | 数量 | 平均用时 | 一次通过率 |
|---|---|---|---|
| 动态规划 | 4 | 45min | 50% |
| 二叉树 | 3 | 30min | 75% |
| 回溯算法 | 3 | 55min | 33% |
| 链表操作 | 2 | 25min | 100% |
| 位运算 | 2 | 40min | 50% |
| 堆/优先队列 | 1 | 60min | 0% |
从数据可以看出回溯算法和动态规划是我的薄弱环节,特别是当题目需要结合这两种思路时(如分割回文串问题),耗时明显增加。
2.2 典型题目深度解析
以LeetCode 139单词拆分为例,这道题让我在二维动态规划和回溯剪枝之间反复横跳:
python复制def wordBreak(s, wordDict):
n = len(s)
dp = [False]*(n+1)
dp[0] = True
for i in range(1, n+1):
for j in range(i):
if dp[j] and s[j:i] in wordDict:
dp[i] = True
break
return dp[n]
关键突破点在于意识到不需要记录具体分割方案,只需判断可行性。这个认知转变让时间复杂度从O(2^n)降到了O(n^2)。记录这类思维转变过程特别有价值,因为很多题目都是同一解题模式的不同变体。
2.3 错题本整理技巧
我习惯用Notion建立数字错题本,每条记录包含:
- 题目链接和基础信息
- 首次错误解法及分析
- 正确解法的关键步骤
- 同类题目链接(手动关联)
- 下次复习时间(根据艾宾浩斯曲线设置提醒)
对于特别顽固的错题,我会录制3分钟内的解题视频。讲解过程往往能暴露思维盲点,这个方法帮我解决了80%的反复出错问题。
3. 学习内容系统化方法
3.1 知识图谱构建
每周我会用XMind整理知识关联,例如:
code复制动态规划
├── 经典模型
│ ├── 背包问题
│ ├── 最长子序列
│ └── 编辑距离
├── 优化技巧
│ ├── 状态压缩
│ └── 斜率优化
└── 易错场景
├── 初始化陷阱
└── 遍历顺序
这种可视化呈现能清晰看到哪些分支需要加强。推荐使用不同颜色标注掌握程度,我个人的标准是:红色(仍需加强)→黄色(基本掌握)→绿色(熟练应用)。
3.2 代码片段库建设
建立个人代码片段库能极大提升刷题效率。我的VSCode片段配置如下:
json复制{
"Binary Search Template": {
"prefix": "bsearch",
"body": [
"left, right = 0, len(nums)-1",
"while left <= right:",
" mid = left + (right-left)//2",
" if nums[mid] == target:",
" return mid",
" elif nums[mid] < target:",
" left = mid + 1",
" else:",
" right = mid - 1",
"return -1"
]
}
}
目前已经积累了20+常用模板,包括快速排序、DFS遍历、前缀和等。当遇到新题目时,先思考能否套用或组合现有模板,这比每次都从头开始效率高得多。
4. 效率提升实战技巧
4.1 番茄工作法改良版
传统的25分钟工作周期对算法题不太适用,我调整为:
- 读题+构思:15分钟
- 编码实现:25分钟
- 调试优化:15分钟
- 复盘记录:5分钟
每个周期总计1小时,用Toggl Track记录各环节耗时。数据显示我在回溯类题目上花费的调试时间明显偏长,这说明需要加强剪枝策略的预判能力。
4.2 双指针法专项训练
本周重点突破的双指针技巧,总结出三大应用场景:
- 快慢指针(链表环检测)
- 左右指针(有序数组两数之和)
- 滑动窗口(最长无重复子串)
针对每种场景,我收集了3道典型题目进行对比练习。发现滑动窗口的边界条件最容易出错,特别是当需要维护多个状态变量时。于是整理了如下检查清单:
- 窗口收缩条件是否完备?
- 状态变量更新时机是否正确?
- 结果更新是否放在合适位置?
4.3 调试技巧进阶
除了常规的print调试,本周尝试了几个新方法:
- 可视化调试:对于树和图的问题,使用Graphviz生成中间状态图示
- 差分调试:保存错误版本和正确版本的中间结果,用diff工具对比
- 极端测试用例:手动构造最小规模的出错用例
这些方法在解决LeetCode 76最小覆盖子串时特别有效,通过可视化发现窗口收缩条件存在逻辑漏洞。
