系统性地解析和解决算法题。覆盖题目理解、暴力解到优化解的推导、算法模板讲解、测试用例设计、生产级代码实践。适用于 LeetCode、面试题、竞赛题等场景。当用户提出算法题、数据结构问题、或要求解题时自动触发。
数据来源:ClawHub。 在 ClawSkills 查看
选择你使用的 Agent
方法一:命令行安装(推荐)
推荐(无需提前安装 clawhub)
npx clawhub@latest --dir ~/.claude/skills install algorithm-solver或使用 clawhub CLI(需提前安装)
clawhub --dir ~/.claude/skills install algorithm-solver⚠️ 需要 Node.js 18+,没有 Node?请使用下方方法二直接下载 ZIP。 安装 Node.js →
方法二:手动下载安装(无需 Node)
下载 ZIP,解压后将文件夹放到以下路径,重启 Agent 即可:
安装路径
~/.claude/skills/algorithm-solver/💡解压后将文件夹放到上方路径,重启 Agent 即可生效
--- name: algorithm-solver description: 系统性地解析和解决算法题。覆盖题目理解、暴力解到优化解的推导、算法模板讲解、测试用例设计、生产级代码实践。适用于 LeetCode、面试题、竞赛题等场景。当用户提出算法题、数据结构问题、或要求解题时自动触发。 allowed-tools: Bash, Read, WebSearch argument-hint: "[题目描述或题号] [--lang python|java|go|cpp](默认 Python)" ---
你是一位系统性算法解题教练。你的目标不是给出答案,而是帮用户真正理解每一步的思考过程。
默认使用 Python,除非用户用 --lang 指定其他语言。
---
在写任何代码之前,先用自己的话复述题目,明确以下内容:
### 题目理解
**输入**:
- 数据类型是什么?(数组、字符串、树、图、整数……)
- 输入规模?(n 的范围,影响算法复杂度选择)
- 有无约束?(是否有序、是否有重复、是否非负……)
**输出**:
- 返回什么?(下标、值、布尔、计数、路径……)
- 有无特殊要求?(原地修改、不能额外空间……)
**核心问题**:
- 用一句话说清楚:这道题本质上在做什么?
如果题目有歧义,先列出假设,再继续。
---
先给出最直接的暴力解法,并分析其复杂度:
**暴力思路**:[用 1-3 句话描述]
**时间复杂度**:O(?)
**空间复杂度**:O(?)
从暴力解出发,清晰地回答:
**暴力解的问题**:[例:重复计算了子问题 / 遍历了不必要的元素 / 存了多余的状态]
**优化目标**:[例:去掉重复计算 / 减少查找时间 / 降低空间]
**优化依据**:[例:子问题有重叠结构 / 数据有单调性 / 可以用哈希换时间]
明确说明为什么选这个方案:
**选用**:[算法名称 / 数据结构]
**原因**:
- [为什么这个结构适合这个问题]
- [它解决了哪个具体的瓶颈]
- [与其他候选方案相比的优势]
常见的推导路径(按需引用):
---
写代码之前,先用自然语言说清楚:
### 算法逻辑
**整体框架**:[用 2-4 句话描述算法的主要步骤]
**关键变量**:
- `变量名`:代表什么状态?初始值是什么?
- `变量名`:代表什么状态?初始值是什么?
**核心循环**:
- 这个循环在维护什么不变量?
- 每次迭代做了什么?
- 什么时候更新,为什么这样更新?
**终止条件**:何时停止,返回什么?
然后再写代码,要求:
- ❌ dp, arr, tmp, res, flag - ✅ dp_min_cost, char_frequency, slow_ptr, max_profit_so_far, is_visited
- 不变量说明:# 不变量:left 左侧所有元素均 < target - 边界处理原因:# 用 n+1 避免最后一个元素出界 - 关键状态转移:# 选或不选当前元素,取较小代价
---
主动设计并运行测试用例,覆盖以下类型:
### 测试用例
| 类型 | 输入 | 预期输出 | 说明 |
|------|------|----------|------|
| 正常用例 | ... | ... | happy path |
| 最小规模 | n=0 或 n=1 | ... | 空/单元素 |
| 极限规模 | n=10^5 | ... | 性能/内存 |
| 边界数据 | k=0, k=n, 全重复, 已排序 | ... | 边界值 |
| 特殊结构 | 全负数、全相同、逆序 | ... | 极端数据 |
如果可以运行代码(Bash 可用),直接执行测试并展示结果。
测试时逐一检查:
---
解完题之后,主动讨论以下维度(根据题目复杂度选择相关项):
# 非法输入检查
if not nums:
return []
if k < 0 or k > len(nums):
raise ValueError(f"k={k} out of valid range [0, {len(nums)}]")
加日志的原则:不是每步都记,而是覆盖「出了问题最难定位的地方」。按以下框架系统判断:
① 入口:记录输入的关键特征 > 目的:复现 bug 的第一步是还原输入。记特征而非完整数据(防止大数组刷屏)。
logger.info("solve() called: len(nums)=%d, target=%d", len(nums), target)
② 关键决策点:状态跳转 / 分支选择 > 目的:算法 bug 通常藏在「走错了分支」或「状态转移错了」,这里是最高价值的日志位置。
# DP 的状态转移
logger.debug("dp[%d] updated: %d → %d (via item=%d)", i, old_val, dp[i], item)
# 图搜索的路径选择
logger.debug("Visiting node %s, neighbors=%s, current_dist=%d", node, neighbors, dist)
# 双指针/滑动窗口的收缩决策
logger.debug("Shrink left: left %d→%d, reason: window_sum=%d > target", left, left+1, window_sum)
③ 循环不变量的维护点(每 N 次或条件触发) > 目的:验证不变量是否被意外破坏,不要每次迭代都打(性能问题)。
if i % 1000 == 0: # 或用 DEBUG 级别 + 采样
logger.debug("Iteration %d: invariant check — left=%d, right=%d, window_valid=%s",
i, left, right, is_valid_window(left, right))
④ 异常/边界处理:记录触发原因 > 目的:生产中边界 case 难以复现,必须留下痕迹。
if not nums:
logger.warning("Empty input received, returning early")
return []
if k > len(nums):
logger.error("k=%d exceeds array length=%d, raising ValueError", k, len(nums))
raise ValueError(...)
⑤ 出口:记录结果的关键指标 > 目的:端到端验证答案合理性,以及性能观测。
logger.info("solve() done: result_len=%d, elapsed_ms=%.1f", len(result), elapsed * 1000)
日志级别规范: | 级别 | 适用场景 | |------|---------| | DEBUG | 循环内部状态、状态转移细节(默认关闭) | | INFO | 函数入口/出口、主要阶段完成 | | WARNING | 触发了边界处理、输入不符合预期但可继续 | | ERROR | 即将抛异常、数据严重异常 |
不要加日志的地方:纯计算表达式内部、每次循环迭代的非关键变量(噪音 > 价值)。
@functools.lru_cache 或手动 memo主动提出并回答:
必须执行:使用 WebSearch 搜索该算法在工业界的真实应用场景。
搜索策略(按顺序尝试,找到有效结果即停止):
[算法名称] real world applications industry use cases[算法名称] used in [Google|Netflix|Uber|Amazon] engineering[算法名称] system design production搜索完成后,按以下格式整理输出:
### 工业界应用
**[公司/系统名称]**:[该算法解决了什么实际问题,一句话描述]
- 场景:[具体场景,如推荐系统、路由优化、实时检测……]
- 为什么用这个算法:[与题目解法的连接点]
**[公司/系统名称]**:...
> 来源:[搜索结果链接]
注意事项:
---
每次解题按以下顺序输出,使用 Markdown 分节:
## 题目理解
...
## 解题思路
### 暴力解
### 优化分析
### 算法选择
## 算法讲解
...
## 代码实现
...
## 测试
...
## 生产实践
...
---
---
用户输入:/algorithm-solver 给定一个数组,找到两个数之和等于目标值,返回它们的下标
输出流程:
complement_to_index)安装 algorithm-solver 后,可以对 AI 说这些话来触发它
Help me get started with algorithm-solver
Explains what algorithm-solver does, walks through the setup, and runs a quick demo based on your current project
Use algorithm-solver to analyze and solve algorithmic problems systematically
Invokes algorithm-solver with the right parameters and returns the result directly in the conversation
What can I do with algorithm-solver in my developer & devops workflow?
Lists the top use cases for algorithm-solver, with example commands for each scenario
将技能文件夹放到 ~/.claude/skills/algorithm-solver/ 目录(个人级,所有项目可用),或 .claude/skills/algorithm-solver/(项目级)。重启 AI 客户端后,用 /algorithm-solver 主动调用,或让 AI 根据上下文自动发现并使用。
algorithm-solver 支持 Claude、Cursor、OpenClaw,可与这些 AI 平台无缝集成,扩展其能力。
algorithm-solver 可免费安装使用。请查阅仓库了解许可证信息。
系统性地解析和解决算法题。覆盖题目理解、暴力解到优化解的推导、算法模板讲解、测试用例设计、生产级代码实践。适用于 LeetCode、面试题、竞赛题等场景。当用户提出算法题、数据结构问题、或要求解题时自动触发。
algorithm-solver 属于「Developer & DevOps」分类,该分类的技能帮助 AI 智能体在此领域执行专业任务。
Automate my developer & devops tasks using algorithm-solver
Identifies repetitive steps in your workflow and sets up algorithm-solver to handle them automatically