1. 项目背景与需求解析
"div3 970个人笔记"这个项目名称看似简单,却蕴含着一个程序员对知识管理的深度思考。作为一名长期奋战在代码一线的开发者,我深知在技术快速迭代的今天,如何高效整理和检索个人知识库的重要性。这个项目正是为了解决这个痛点而生。
div3这个前缀让我联想到可能是某个在线编程平台(如Codeforces)的题目分类编号,而970可能是具体的题目ID。这类平台通常会有div1/div2/div3的难度分级,其中div3属于入门到中等难度范围。将解题笔记系统化管理,对于算法竞赛选手和编程学习者来说具有实际价值。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术选型与架构设计
2.1 笔记存储方案比较
在构建个人笔记系统时,我对比了几种主流方案:
-
本地Markdown文件:
- 优点:纯文本、版本控制友好
- 缺点:跨设备同步困难
- 典型工具:VS Code + 插件体系
-
云笔记平台:
- 优点:开箱即用、多端同步
- 缺点:定制性差、数据封闭
- 代表产品:Notion、语雀
-
自建Wiki系统:
- 优点:高度可定制
- 缺点:维护成本高
- 例如:Wiki.js、DokuWiki
最终我选择了基于Git的Markdown方案,因为:
- 完美支持代码高亮和数学公式
- 可以通过Git实现版本控制和多设备同步
- 纯文本格式保证长期可读性
2.2 目录结构设计
经过多次迭代,我的笔记目录结构如下:
code复制/div3_970
├── problem.md # 题目描述与解析
├── solution.cpp # 标准解法代码
├── solution.py # 备用语言实现
├── testcases # 测试用例目录
│ ├── input1.txt
│ ├── output1.txt
│ └── ...
└── notes.md # 解题思路与心得
这种结构的特点是:
- 题目描述与实现解耦
- 多语言支持
- 测试用例与代码共存
- 思路记录独立存放
3. 核心功能实现细节
3.1 自动化测试集成
为了确保笔记中的代码始终保持可运行状态,我配置了GitHub Actions自动化测试:
yaml复制name: Verify Solution
on: [push]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Compile C++
run: g++ solution.cpp -o solution
- name: Run tests
run: |
for i in testcases/input*.txt; do
./solution < $i > output.tmp
diff -w output.tmp testcases/output${i#*input} || exit 1
done
这个工作流会在每次push时:
- 编译C++代码
- 用所有测试用例验证输出
- 任何失败都会中断流程
3.2 知识图谱构建
为了让笔记之间产生关联,我开发了简单的Python脚本自动生成知识图谱:
python复制import glob
import networkx as nx
import matplotlib.pyplot as plt
G = nx.DiGraph()
# 解析所有笔记文件中的标签
for note in glob.glob("**/*.md", recursive=True):
with open(note) as f:
tags = [line.split(":")[1].strip()
for line in f if line.startswith("tags:")]
if tags:
G.add_node(note, tags=tags[0].split(","))
# 根据共同标签创建边
nodes = list(G.nodes())
for i in range(len(nodes)):
for j in range(i+1, len(nodes)):
common_tags = set(G.nodes[nodes[i]]['tags']) & set(G.nodes[nodes[j]]['tags'])
if common_tags:
G.add_edge(nodes[i], nodes[j], weight=len(common_tags))
# 可视化
pos = nx.spring_layout(G)
nx.draw(G, pos, with_labels=True)
plt.show()
4. 高效笔记方法论
4.1 标准化笔记模板
每个笔记文件都遵循固定模板:
markdown复制# [题目编号] 题目名称
**标签**: 算法分类, 难度级别
## 题目描述
[粘贴题目内容]
## 输入输出格式
[说明输入输出要求]
## 解题思路
1. 关键观察点
2. 算法选择理由
3. 时间/空间复杂度分析
## 代码实现
```cpp
// 完整可运行代码
测试用例
text复制输入样例1:
...
输出样例1:
...
心得总结
- 遇到的坑
- 优化方向
- 相关题目推荐
code复制
### 4.2 检索优化技巧
为了快速找到特定内容,我采用以下策略:
1. **命令行检索**:
```bash
# 查找所有包含"动态规划"的笔记
rg "动态规划" --type md
# 查找未完成的笔记
rg "TODO" --type md
- 标签系统:
- 每个笔记开头明确定义标签
- 标签格式:
标签: 算法, 难度, 分类 - 示例:
标签: 动态规划, div3, 背包问题
- 别名机制:
在.zshrc中添加:
bash复制alias notes='cd ~/notes && nvim -c "Telescope find_files"'
alias search-notes='cd ~/notes && rg'
5. 实用工具链配置
5.1 开发环境搭建
我的笔记工作流依赖以下工具:
- 编辑器配置:
lua复制-- init.lua 关键配置
require('telescope').setup{
defaults = {
file_ignore_patterns = { "%.pdf", "%.zip" }
}
}
vim.keymap.set('n', '<leader>ff', ':Telescope find_files<CR>')
vim.keymap.set('n', '<leader>fg', ':Telescope live_grep<CR>')
- 预览增强:
- Markdown预览:
glowCLI工具 - 流程图支持:
mermaid-cli - 数学公式:
pandoc+ LaTeX
5.2 自动化脚本
定期执行的维护脚本:
python复制# lint_notes.py
import glob
import subprocess
def check_missing_tags():
for note in glob.glob("**/*.md", recursive=True):
with open(note) as f:
if not any(line.startswith("tags:") for line in f):
print(f"Missing tags: {note}")
def check_uncompiled_code():
result = subprocess.run(
["rg", "--count", "```[a-z]+", "--type", "md"],
capture_output=True, text=True)
print("Code blocks count per file:")
print(result.stdout)
if __name__ == "__main__":
check_missing_tags()
check_uncompiled_code()
6. 避坑指南与经验总结
6.1 常见问题解决
-
多设备同步冲突:
- 解决方案:设置pre-commit钩子检查文件修改时间
bash复制# .git/hooks/pre-commit if [[ $(git diff --name-only) =~ "notes" ]]; then find notes -name "*.md" -mtime -1 | grep -q . || { echo "笔记文件24小时内未修改,请确认同步状态" exit 1 } fi -
大文件版本控制:
- 使用git-lfs管理PDF等二进制附件
bash复制git lfs track "*.pdf" git add .gitattributes
6.2 效率提升技巧
-
代码片段管理:
bash复制# 快速插入常用代码片段 function insert_snippet() { cat ~/notes/snippets/$1 >> $(fzf --preview 'bat --color=always {}') } alias is=insert_snippet -
终端集成:
bash复制# 在终端直接查看笔记 function note() { rg "$1" --color=always --heading --line-number ~/notes | less -R } -
可视化进度跟踪:
python复制# progress.py import matplotlib.pyplot as plt from collections import defaultdict stats = defaultdict(int) for note in glob.glob("**/*.md", recursive=True): with open(note) as f: for line in f: if line.startswith("tags:"): for tag in line.split(":")[1].strip().split(","): stats[tag.strip()] += 1 plt.barh(list(stats.keys()), list(stats.values())) plt.tight_layout() plt.savefig('progress.png')
这套个人笔记系统经过两年迭代,目前包含300+算法题目笔记,50+技术概念详解。最大的收获是建立了可追溯的知识进化轨迹,任何解题思路的转变都有据可查。对于技术学习者,我强烈建议尽早建立这样的个人知识库,时间越长价值越大。
