为什么LeetCode官方难度标签不够用?leetcode_problem_rating竞赛题目难度评级工具完整解读
【免费下载链接】leetcode_problem_ratingSelf-calculated rating of problems in leetcode weekly/biweekly contests.项目地址: https://gitcode.com/gh_mirrors/le/leetcode_problem_rating
leetcode_problem_rating 是一款LeetCode 竞赛题目难度评级工具,基于 Elo 评分系统 + 最大似然估计,为每道 LeetCode 周赛/双周赛题目算出一个精确到小数的难度分数。一个数字就能告诉你任意竞赛题的真实难度,比官方 Easy/Medium/Hard 三档标签实用得多,每周自动更新数据 📊
一、官方 Easy/Medium/Hard 标签为什么不够用?
如果你常打周赛,一定有这样的经历:
- 三档太粗:所有 "Hard" 题都叫 Hard,但其中 1600 分的题和 3500 分的题,难度根本是两个世界;
- 标签是静态的:官方难度基本不随社区变强而调整,同一档内跨度可达上千分;
- 竞赛题经常"骗人":有些题标着 Medium,实际却是最难啃的 1700+ 分题。
所以很多刷题党想知道的其实是:这道题到底相当于几分?leetcode_problem_rating 就是为回答这个问题而生的。
二、leetcode_problem_rating 是如何给题目打分的?
🎯 它的评分引擎(后端计算)结合了两种经典方法:
- Elo 评分系统:和棋类比赛一样,把"用户分数"与"题目难度"互相校准——高分用户能做出来的题,难度自然被推高;
- 最大似然估计(MLE):利用大量用户的提交结果,反推出每道题最可能的难度分值。
几个需要提前了解的事实:
| 事实 | 说明 |
|---|---|
| 数据来源 | 由爬虫抓取 LeetCode 周赛/双周赛的题目与提交数据 |
| 更新频率 | 每周赛后更新一次 |
| 覆盖范围 | 不含第 1~62 场周赛(早期接口不同),共 2500+ 道竞赛题 |
| 后端代码 | 出于合规考虑未开源,仅开源前端与数据 |
| 精确度 | 作者声明:不是 100% 准确,但足以评估题目的相对难度 |
三、数据速览:2561 道竞赛题的难度全景
打开 ratings.txt 就能按难度降序看到全部题目。目前分数范围大约在1084 ~ 3773分之间。
难度 Top 5 题目一览(节选自 ratings.txt):
| 排名 | 题目 | 出处 | 位置 | 评分 |
|---|---|---|---|---|
| 1 | 判断矩形的两个角落是否可达 | 第 408 场周赛 | Q4 | 3773.76 |
| 2 | 循环划分的最大得分 | 第 475 场周赛 | Q4 | 3124.50 |
| 3 | 交替组 III | 第 409 场周赛 | Q4 | 3112.04 |
| 4 | 标记所有下标的最早秒数 II | 第 386 场周赛 | Q4 | 3111.13 |
| 5 | 最小可整除数位乘积 II | 第 143 场双周赛 | Q4 | 3101.48 |
而全场最轻松的题是第 144 场周赛 Q1「IP 地址无效化」(ID 1108),仅 1084.13 分。
📌 一个有趣的现象:几乎所有 3000+ 的高分题都出自Q4,说明竞赛最后一题与前三题的难度断层非常明显——这正是官方三档标签看不出来的细节。
四、在线查询指南:三步定位任意题目分数
该项目的前端是一个 Vue 3 + TypeScript 单页应用(ProblemRating.vue),已部署为在线站点。使用方法非常简单:
- 输入关键词:搜题目 ID、英文名或中文名,回车即可筛选;
- 按比赛编号定位:填入周赛/双周赛场次数(如 408),快速查看整场比赛的难度分布;
- 按分数区间过滤:设置评分区间的左右边界,只看你目标难度段的题目,还可以点击表头对任意列排序。
站点支持中英文一键切换(文案见 zh.ts),表格中每道题都可直接点击跳转到 LeetCode 对应题目页和比赛页,找题 → 看难度 → 去刷题,一步不断档。
五、本地使用:把数据文件直接拿回来
如果你想在自己的脚本或插件里用这份难度数据,直接克隆仓库即可:
git clone https://gitcode.com/gh_mirrors/le/leetcode_problem_rating仓库内数据文件说明:
- ratings.txt:原始数据,制表符分隔,按评分降序排列,共 2561 行。每行 7 列:
Rating / ID / Title / Title ZH / Title Slug / Contest Slug / Problem Index; - gen.py:一个极简的 Python 脚本,把 ratings.txt 转成前端用的 data.json,顺便把比赛 slug 转换成 "Weekly Contest N / 第 N 场周赛" 这样的友好名称;
- data.json:转换后的 JSON 数据,也是前端页面加载的数据源。
这样你在本地也能用几行 pandas 或 awk 就完成统计,比如"统计某场双周赛四道题的难度均值"。
六、项目结构一览
leetcode_problem_rating ├── ratings.txt # 原始难度数据(每周更新) ├── gen.py # txt → json 转换脚本 ├── data.json # 前端数据源 ├── public/ # 静态资源 └── src/ ├── views/ProblemRating.vue # 查询页面主体 ├── locale/ # 中/英文案(zh.ts / en.ts) ├── router/ # 路由 └── store/ # 状态管理技术栈为 Vue 3 + Element Plus + vue-router + vuex + vue-i18n,结构清晰,适合想学 Vue 3 组合式 API 的新手阅读 src/main.ts 的入口代码。
七、常见问题 FAQ
Q1:评分准确吗?作者明确说"不是 100% 准确,但足以评估题目相对难度"。把它当作一个相对难度坐标使用最合理。
Q2:为什么没有第 1~62 场周赛的数据?早期比赛的接口与其他比赛不同,数据无法采集,所以结果中不包含这部分。
Q3:为什么不开源后端?后端依赖网页爬虫抓取数据,为避免违反平台条款和相关规定,作者选择不公开这部分代码,仅开源前端和数据。
Q4:数据会一直更新吗?会的。ratings.txt 会在每周赛后更新,仓库通过 CI 自动构建部署在线站点。
一句话总结:官方标签告诉你"这题是 Hard",leetcode_problem_rating 告诉你"这道题相当于 3124 分"。无论是安排刷题计划、判断竞赛出题难度,还是做难度预测插件,这份持续更新的竞赛题难度评级数据都值得收藏 ⭐
【免费下载链接】leetcode_problem_ratingSelf-calculated rating of problems in leetcode weekly/biweekly contests.项目地址: https://gitcode.com/gh_mirrors/le/leetcode_problem_rating
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考