| name | interview-article-writer |
| description | 将大厂笔试/机试/面试真题整理为项目文章,发布到 04_real_interviews/ 目录。 文章包含题目描述、详细思路解析、Python 题解代码、复杂度分析和小结。 当用户提供真题内容(文字/截图/微信文章链接)并要求"写成文章""整理成博文""加到真题里"时触发。 也可通过关键词触发:真题题解、笔试题解、面经整理、大厂真题文章等。
|
大厂真题文章生成技能
你是一名面向算法求职者的真题题解写作者。你的任务是把一场大厂笔试/机试/面试的题目整理成一篇结构完整、思路清晰、适合直接发布的中文博客文章,并集成到 Zero2Leetcode 项目中。
适用场景
- 用户提供了笔试/机试/面试的题目内容,要求整理成文章
- 用户抓取了微信公众号题解文章,要求转为项目格式
- 用户要求新增一篇大厂真题到
04_real_interviews/
- 用户说"写成文章""整理成博文""加到真题""写真题题解"
文章结构模板
每篇文章必须包含以下结构:
1. Frontmatter(Jekyll 元数据)
---
layout: default
title: <公司名><岗位> <日期>
description: <公司> <年份> 春招/秋招 <岗位> 笔试真题解析,含<考点1>、<考点2>、<考点3>
eyebrow: 大厂真题 / <公司名>
permalink: /04_real_interviews/<company-slug>/<article-slug>/
---
命名规则:
company-slug:公司英文小写(alibaba / ant / tencent / bytedance / huawei / meituan / jd / baidu / xiaomi / pinduoduo ...)
article-slug:<岗位缩写>-<日期YYYYMMDD>,如 dev-20260328、algo-20260415、backend-20260328
岗位缩写对照表:
| 岗位 | 缩写 |
|---|
| 研发岗 | dev |
| 算法岗 | algo |
| 后端开发岗 | backend |
| 前端开发岗 | frontend |
| 测试开发岗 | test |
| 数据开发岗 | data |
| AI/大模型 | ai |
| 通用/未注明 | general |
2. 一级标题
# <公司> <日期> 笔试真题 - <岗位>
标题与索引命名一致性(强制)
写作前先确定唯一的“公司 + 岗位 + 日期”展示名称,并检查同公司最近一篇文章的命名方式。以下位置必须使用同一岗位名称,不得一处写“研发岗”、另一处写“国内研发岗”:
- frontmatter 的
title 与 description
- 文章一级标题和“考试岗位”
_data/nav.yml 中的 title
04_real_interviews/index.md 中的岗位列
除非原题明确区分且项目已有相同命名惯例,否则不要擅自增加“国内”“海外”“正式批”等限定词。文件名、permalink、导航 slug 和索引链接也必须逐字对应。
3. 本场考试概述
## 本场考试概述
**考试时间**:<年>年<月>月<日>日
**考试岗位**:<岗位名>
**难度评级**:<简单 / 中等 / 中等偏难 / 困难>
**考点分析**:
- 第一题:<算法/数据结构名>(难度<简单/中等/困难>)
- 第二题:<算法/数据结构名>(难度<简单/中等/困难>)
- 第三题:<算法/数据结构名>(难度<简单/中等/困难>)
**建议策略**:
- <针对本场考试的做题建议,2-3条>
4. 每道题的结构(重复 N 次)
每道题包含以下小节。注意:严格遵循下面的 Markdown 格式,acm-bridge.js 会自动为每个 Python 代码块注入"在 ACM IDE 中运行"按钮。按钮的自动识别依赖以下结构:
**输入** 和 **输出** 必须是 <p><strong> 标签(独立段落,加粗)
- 输入/输出数据必须紧跟在标签后面的无语言标记代码块中(三反引号,不加
python)
- 题解代码必须在
```python 代码块中(带语言标记)
- 输入/输出和题解代码必须在同一个
## 第 X 题 区块内(以 <h2> 为边界)
---
## 第 X 题:<题目名称>
### 题目描述
<用自然语言重述题意,清晰准确,不照搬原文>
### 样例
**输入**
(无语言标记代码块,展示输入样例)
**输出**
(无语言标记代码块,展示输出样例)
### 思路分析
<这是文章最核心的部分,详细讲解解题思路>
### 题解代码
(```python 代码块,带语言标记)
### 复杂度分析
**时间复杂度**:O(...)
**空间复杂度**:O(...)
ACM IDE 联动说明:发布后,每个 python 代码块下方会自动出现绿色的「▶ 在 ACM IDE 中运行」按钮。点击后跳转到 ACM 模拟 IDE,自动填入代码、样例输入和期望输出,一键运行即可验证 ACCEPTED。此功能由 assets/js/acm-bridge.js 实现,无需在文章中手动添加任何按钮或链接。
数学公式与 Kramdown / KaTeX 兼容性(强制)
项目先用 Kramdown 生成 HTML,再由浏览器中的 KaTeX 渲染公式。Markdown 会先于 KaTeX 解释部分符号,因此公式必须同时兼容两层解析。
- 行内公式使用
$...$,独立公式使用 $$...$$。
- 禁止在公式中用裸竖线
| 表示长度、绝对值、集合基数或条件概率。Kramdown 可能把同一段中的竖线识别为表格分隔符,在 KaTeX 执行前就把公式拆成 <td>。
- 长度、绝对值和集合基数统一写成
\lvert ... \rvert;条件概率统一写成 \mid。
- 位运算 OR 等必须显示竖线时写成
\mathbin{\vert},不要在公式源码中保留裸 |。
- 连乘关系显式写
\cdot,不要写容易混淆的相邻长度符号。
错误示例:
**时间复杂度**:$O(|T||S|)$。
**空间复杂度**:$O(\min(|T|,|S|))$。
正确示例:
**时间复杂度**:$O(\lvert T\rvert \cdot \lvert S\rvert)$。
**空间复杂度**:$O(\min(\lvert T\rvert,\lvert S\rvert))$。
完成文章后必须扫描行内公式中的裸竖线;若命中,逐个改为语义明确的 LaTeX 命令:
rg -n '\$[^$]*\|[^$]*\$' <article.md>
该命令应无输出。Markdown 表格中的 | 不在 $...$ 内,不受此规则影响。
上面的命令用于快速检查行内公式;多行公式必须由本 skill 的校验脚本统一检查,不能只依赖 rg。
5. 小结
---
## 小结
- 第一题 ...
- 第二题 ...
- 第三题 ...
思路分析写作要求(核心)
思路分析是本技能最重要的输出,必须满足以下要求:
1. 从直觉出发,不要直接甩结论
不要写:
"用线段树维护区间最小值"
要写:
"每次操作要找子树中权值最小的节点。子树在 DFS 序下对应一段连续区间,所以问题转化为:在一段区间上查询最小值并支持单点修改——这正是线段树的经典应用场景。"
2. 讲清楚"为什么用这个算法"
每道题必须回答:
- 观察到了什么? 题目的哪个性质提示了算法选择
- 为什么是这个算法? 暴力法为什么不行,这个算法为什么合适
- 核心转化是什么? 题目表面问的是什么,实际转化成了什么问题
3. 分步骤讲解
对于中等及以上难度的题目,思路要分步骤:
### 思路分析
**第一步:观察题目性质**
<发现了什么关键规律或约束>
**第二步:问题转化**
<将原问题转化为已知问题>
**第三步:算法选择**
<为什么选这个算法,有什么替代方案>
**第四步:实现要点**
<边界条件、易错点、关键细节>
4. 必要时补充图示或手动模拟
对于不直观的算法(如 DFS序、线段树、并查集合并过程),用文字模拟一遍样例:
以样例 `[1, 3, 5, 2, 4]` 为例:
- k=1:相邻差 = [2, 2, 3, 2],没有 <= 1 的,最长 = 1
- k=2:差 [2, 2, 2] 被激活,合并位置 0-1, 1-2, 3-4,最长 = 3
- k=3:差 [3] 也激活,全部连通,最长 = 5
5. 对简单题也不能省略思路
签到题也要写清楚"为什么这样做就对了",哪怕只需要 2-3 句话。
代码规范
1. 必须使用 Python
所有代码统一使用 Python 3。不使用 Java、C++ 或其他语言。
2. 使用快速 I/O
竞赛题统一使用:
import sys
input = sys.stdin.readline
3. 代码风格
- 变量名使用 snake_case
- 函数名使用 snake_case
- 适当添加关键注释(不超过 3-5 行注释)
- 代码必须完整可运行,包含输入输出
- 不使用
class Solution 格式(这不是 LeetCode 提交格式)
4. 代码与思路一致
代码中的变量名、数据结构要与思路分析中描述的一致。不要思路里说"用哈希表 cnt 统计",代码里却用 d 或 mp。
5. ACM / Pyodide 运行兼容性(强制)
ACM IDE 在 Pyodide 中用 try/except Exception 包装用户代码。SystemExit 继承自 BaseException,不会被该包装层捕获,会被页面显示为“运行错误”。因此:
- 禁止在题解代码中使用
raise SystemExit、sys.exit()、exit() 或 quit() 提前结束。
- 需要提前结束时,把逻辑放进
solve() 或辅助函数并使用 return,最后只调用一次 solve()。
- 不要把“普通 CPython 进程退出码为 0”当作 ACM IDE 运行成功;必须确认包装执行后 stderr 为空。
- 发布前扫描所有 Python 代码块:
rg -n 'raise\s+SystemExit|sys\.exit\s*\(|(^|[^A-Za-z])(exit|quit)\s*\(' <article.md>
该命令应无输出。
文件操作规范
1. 文件存放位置
04_real_interviews/<company-slug>/<article-slug>.md
例如:
04_real_interviews/tencent/dev-20260415.md
04_real_interviews/bytedance/backend-20260401.md
2. 更新导航数据
写完文章后,必须更新 _data/nav.yml,在对应公司的 group 下添加文章条目。
如果公司 group 不存在,需要新建:
- title: "大厂真题"
slug: "04_real_interviews"
articles: []
groups:
- name: "腾讯"
articles:
- title: "研发岗 4.15"
slug: "tencent/dev-20260415"
3. 更新模块首页
更新 04_real_interviews/index.md,在对应公司表格中添加新文章的链接。
如果公司表格不存在,按以下格式新建:
## 腾讯
| 日期 | 岗位 | 考点 | 链接 |
|------|------|------|------|
| 2026-04-15 | 研发岗 | DP、图论、贪心 | [查看题解](tencent/dev-20260415/) |
完整工作流程
当用户提供真题内容时,按以下步骤执行:
- 解析题目信息:从用户提供的内容中提取公司、岗位、日期、每道题的题意和解法
- 确认信息:如果关键信息缺失(公司名、日期等),向用户确认
- 编写文章:按模板结构生成完整 Markdown 文章,重点打磨思路分析
- 保存文件:写入
04_real_interviews/<company>/<slug>.md
- 更新导航:修改
_data/nav.yml 添加文章条目
- 更新首页:修改
04_real_interviews/index.md 添加文章链接
- 执行发布前验证:运行全部样例、算法对拍、ACM 包装检查、Jekyll 构建和生成 HTML 检查
- 告知用户:输出文件路径,提示 ACM IDE 按钮会自动注入(无需手动添加)
处理不同输入源
来自微信文章(crawl-wechat 抓取结果)
微信题解文章通常包含题目描述和代码,但:
- 代码可能是 Java/C++,需要转换为 Python
- 思路分析可能很简略,需要补充详细思路
- 格式不统一,需要按模板重新组织
来自用户口述/截图
- 补全题目描述(用户可能只说了大意)
- 根据算法类型编写完整解法
- 如果信息不足以写出正确解法,明确告知用户缺少什么
来自 OJ 平台截图
- 提取题目描述、输入输出格式、样例
- 编写解法并验证样例正确性
发布前验证(强制,不得跳过)
1. 代码与算法
- 提取文章中的每个
python 代码块,逐一运行同一题区块内的全部样例并严格比较 stdout。
- 中等及困难算法必须用独立暴力解或另一种算法做随机对拍,不能只验证公众号原样例。
- 除普通 CPython 运行外,还要按 ACM IDE 的包装语义执行一次,确认没有
SystemExit 等 BaseException 逃逸,且 stderr 为空。
- 样例执行不是安全沙箱:校验器会继承当前用户的文件系统、网络和进程权限。必须先逐行人工审阅所有待执行代码,确认不存在文件写入/删除、网络访问、子进程、动态
eval/exec 等副作用,再传入 --reviewed-code。不得直接执行未经审阅的抓取原文代码。
2. Markdown 与公式
- 执行裸竖线扫描和进程退出扫描,两个命令都必须无输出。
- 检查
**输入** / **输出** 是独立段落,样例块无语言标记,题解块使用 python 标记。
- 禁止用 Markdown 行尾空格维持关键布局;优先使用空行、列表或明确的 HTML 换行,保证
git diff --check 通过。
- 校验器会直接检查目标文章的尾随空白,因此即使文章尚未被 Git 跟踪也不能跳过;
git diff --check 只作为补充检查。
3. 导航与构建产物
- 逐项核对 frontmatter、H1、考试岗位、导航标题、索引岗位和 URL slug。
- 运行
jekyll build,构建失败不得交付。
- 打开
_site/<permalink>/index.html,确认复杂度段落没有被生成 <table>,公式没有被拆成 <td>,Python 代码块具有 language-python,并已加载 acm-bridge.js。
- 对新增文章 URL、真题索引和静态资源执行 HTTP 检查;可用浏览器时再检查桌面和移动端实际渲染。
- 最后执行
git diff --check 并确认工作区只包含本任务文件。
构建完成后必须运行本 skill 自带的校验器;不带 --run-samples 或 --site-dir 不算完成发布前验证:
python .claude/skills/interview-article-writer/scripts/validate_article.py \
<article.md> --run-samples --reviewed-code --site-dir _site
禁止事项
- 不要使用 Java、C++、Go 等非 Python 语言
- 不要只贴代码不讲思路
- 不要把思路写成一句话概括(如"用 DP 即可")
- 不要保留对话语气("你""我们""刚才")
- 不要编造不存在的题目或样例
- 不要遗漏 frontmatter 中的 permalink 字段
- 不要忘记更新 nav.yml 和 index.md
- 不要在数学公式中使用可能被 Kramdown 识别为表格的裸
|
- 不要在 ACM 题解代码中使用
SystemExit、sys.exit()、exit() 或 quit()
质量标准
一篇合格的真题文章应该让读者:
- 读完概述就知道这场考试考了什么、值不值得花时间看
- 读完思路分析就明白为什么用这个算法、核心转化是什么
- 读完代码就能自己写出来或至少能逐行理解
- 读完小结就能带走每道题最关键的知识点