
刷题这件事工具选对了效率能差出好几倍。我最早是在网页上刷的题目描述在左边、编辑器在右边写着写着顺手想按个 CtrlS结果浏览器弹出来的是保存网页对话框。后来我把整套流程搬进了 VSCode用 LeetCode 插件来做题目拉取、代码生成、本地跑用例和提交一年多下来积累了几百道题的源码仓库。这篇就聊聊 VSCode 中配置 LeetCode 插件这件事从环境准备、插件安装、核心配置项逐条拆解到实际做一道题的完整流程再到踩过的坑和排查方法全部按我自己的实操顺序讲。刚接触 VSCode 的人能照着一步步做下来已经装过插件但总觉得别扭的人也能在配置项和进阶玩法那几节里找到优化点。我默认你手上已经有一台能正常上网的电脑Windows、macOS、Linux 都行插件的配置逻辑基本一致只有路径写法和快捷键略有差别文中会分别标注。1. 为什么要把刷题环境搬到 VSCode1.1 网页编辑器的四个真实痛点先说清楚为什么要折腾这一套不然很容易出现装了插件用两天又回网页的情况。第一个痛点是编辑器能力太弱。网页里的代码框没有本地补全、没有函数跳转、没有格式化写 Python 想用个类型提示、写 C 想看看头文件里的签名全得靠脑子记。而 VSCode 里装上对应的语言扩展补全、跳转、报错提示全都有写起来是两种体验。第二个痛点是没法做版本管理。刷题的价值不只是通过更在于回头复习。网页上的提交记录按时间倒序堆在一起你想按二分查找或者动态规划把题目归类整理只能手动复制粘贴。搬到本地之后整个题目目录就是一个 Git 仓库按标签建分支、写提交信息、隔几个月回看自己的思路变化非常自然。第三个痛点是测试用例要手敲。网页上每测一组边界数据都得在输入框里一个字一个字打进去数组还好链表和二叉树的构造参数能敲到怀疑人生。插件支持在本地保存多组用例反复跑改完代码直接重跑不用重新输入。第四个痛点是上下文割裂。写题的时候想查语言文档、想记两条笔记、想对照自己的模板文件全得在不同标签页之间跳。本地环境里这些都在同一个窗口内分屏一拉就能并排看。1.2 插件到底帮你做了什么LeetCode 这个扩展扩展 ID 是LeetCode.vscode-leetcode作者在扩展市场里就叫 LeetCode本质上是一个账号 题目 本地文件的中间层。它干的事情可以拆成这么几件用你的账号登录站点把题目列表拉下来支持按难度、标签、完成状态筛选选中一道题自动在本地工作区生成一个代码文件文件里带着题目描述注释和函数签名你在本地写代码插件负责把代码发到服务端跑用例把结果拉回来展示通过之后可以直接在编辑器里提交返回耗时、内存占用和失败用例附带展示题解入口和部分提交历史。要注意它不是一个本地判题器真正跑用例和判题还是在服务端完成本地只是承载代码和交互。这一点想明白后面遇到断网了插件为啥不能用这类疑问就不会困惑了。1.3 哪些人适合哪些人不适合如果你是正在系统性刷题、准备面试或者打周赛的人这套环境几乎是必装的投入半小时配置后面几百道题都在收益。如果你有整理题解笔记的习惯想按专题沉淀一套自己的题解库那本地目录 Git 的方式比网页收藏夹靠谱得多。反过来说如果你只是偶尔在通勤路上看两道题、从来不写代码那网页或者手机端更合适插件反而增加负担。还有一种情况是机器性能实在有限本地同时开 VSCode、语言服务和浏览器比较吃力那就需要权衡一下。2. 环境准备VSCode 与 Node.js 的正确装法2.1 VSCode 的安装与中文界面配置从官网下载安装包Windows 用户会看到 System Installer 和 User Installer 两个版本。区别在于 System 版装到 Program Files 下所有用户都能用User 版装到当前用户目录不需要管理员权限。我个人选 System 版因为不用每次更新都点一次 UAC 弹窗。安装过程中有一个添加到 PATH的勾选项务必勾上后面在终端里敲code .打开当前目录就靠它。装完之后第一件事是把界面切成中文。按CtrlShiftX打开扩展面板搜索Chinese找到简体中文语言包装上重启后会提示切换语言如果没提示按CtrlShiftP打开命令面板输入Configure Display Language选zh-cn。这一步不是必须的但插件的一些配置项说明是英文的中英对照着看会轻松些。另外建议顺手装两个基础扩展一个是主题和图标类看个人喜好另一个是EditorConfig for VS Code方便统一缩进风格——刷题时不同语言的缩进习惯不一样Python 用 4 空格、Go 用 Tab有配置文件约束能少很多格式上的杂念。2.2 Node.js 为什么必须装怎么装这是新手最容易跳过的一步然后装完插件发现本地跑不了用例一脸茫然。LeetCode 插件在需要执行本地测试逻辑、处理文件生成等操作时依赖 Node.js 运行时。更直白地说插件本身跑在 VSCode 的扩展宿主里但某些和能力相关的子进程调用需要系统级 node 命令存在。所以哪怕你刷的是 Python 或者 C系统里也得有 Node。装法很简单去 Node.js 官网下载 LTS 版本长期支持版一路下一步。Windows 用户注意安装向导里有个 Add to PATH 默认是勾上的别取消。装完打开终端验证node -v npm -v两条命令都能打印出版本号就说明装好了。如果提示不是内部或外部命令说明 PATH 没生效要么重启终端要么手动把 Node 安装目录加进系统环境变量。注意VSCode 是在启动时读取系统环境变量的装完 Node 之后如果 VSCode 一直开着需要完全退出再重开否则插件识别不到 node会一直报找不到运行时。版本管理方面如果你同时需要多个 Node 版本比如某些前端项目锁定了老版本推荐用 nvm 之类的版本管理工具。但要注意nvm 切换版本后 VSCode 里的插件可能仍指向旧版本这时候可以在插件配置里显式指定leetcode.nodePath指向目标 node 可执行文件的绝对路径这个后面配置那节会细说。2.3 环境准备阶段的三个坑第一个坑是工作区路径含中文或空格。插件的文件生成逻辑在某些版本下对特殊字符处理不够好路径里带中文可能导致文件名生成异常或者本地执行失败。我的建议是单独建一个纯英文路径比如D:\Code\leetcode或者~/code/leetcode短、纯 ASCII、好记。第二个坑是杀毒软件拦截。部分安全软件会拦截 VSCode 扩展调用子进程的行为表现为插件运行一会儿就没反应。如果排查时发现命令发出去了但一直没有回显可以先把实时防护临时关掉测试一下确认是这个问题再把它加进白名单。第三个坑是网络出口的差异。插件需要访问站点接口如果你所在的网络环境对某些域名访问不畅会出现登录超时、题目列表拉取为空。这种情况先确认浏览器能不能正常打开对应站点浏览器能开而插件不能多半是本机 DNS 或者系统时间的问题把系统时间校准一下再试很多时候就好了。3. 插件安装、登录与账号绑定3.1 从扩展市场安装在扩展面板搜索LeetCode会出来好几个结果认准扩展 ID 为LeetCode.vscode-leetcode、安装量最高的那一个。安装完成后左侧活动栏会出现一个 LeetCode 的图标通常是类似代码符号的形状点开就是题目面板。如果活动栏没出现图标先检查扩展是不是真的装上了再看是不是被隐藏活动栏图标设置挡住了右键活动栏空白处能看到所有已注册的视图容器。3.2 三种登录方式的取舍插件支持几种登录路径各有适用场景。账号密码登录是最直观的命令面板里执行LeetCode: Sign in输入用户名和密码就行。它的优点是操作简单缺点是部分站点对第三方客户端登录有限制可能会返回登录失败也可能触发安全校验。Cookie 登录是更常见的做法。插件会用LEETCODE_SESSION和csrftoken这两个值来维持会话。你需要在浏览器登录站点后从开发者工具的 Application/Storage 里把这两个 Cookie 值复制出来填到插件的登录框里。这种方式不经过密码校验成功率高缺点是会过期——站点通常在会话失效后需要重新获取一般几周到一个月不等。第三方登录GitHub 之类在部分站点版本上支持点一下授权就行。如果你的账号本身就是第三方账号注册的优先用这条路。提示不管用哪种方式登录状态都存在本地。Cookie 属于敏感凭据别把它写进任何会提交到公开仓库的文件里工作区的.gitignore里记得排除插件的缓存目录。3.3 登录失败的四步排查法遇到登录不上去按这个顺序查基本能定位。第一步确认站点选择对不对。插件默认可能指向某个站点而你的账号在另一个站点上两边账号体系是分开的自然登不上。命令面板执行LeetCode: Switch Endpoint切换一下再试。第二步确认浏览器能不能访问。如果浏览器都打不开问题在网络层跟插件无关。这时候先解决基础连通性插件那边不用折腾。第三步用 Cookie 方式替代账号密码方式。账号密码被拒的提示信息通常比较含糊换成 Cookie 往往就过了。第四步清缓存重来。命令面板执行LeetCode: Clear Cache把本地缓存的题目数据和登录态清掉重新走一遍流程。缓存损坏导致的假性登录失败在这个插件上并不少见尤其是插件升级版本之后。4. 核心配置项逐条拆解配置入口在Ctrl,打开设置搜leetcode会看到一大串选项。也可以直接编辑settings.json。下面这段是我目前在用的配置可以直接抄把路径换成你自己的{ leetcode.endpoint: leetcode-cn, leetcode.workspaceFolder: D:/Code/leetcode, leetcode.defaultLanguage: python3, leetcode.filePath: { default: { folder: ${id}-${kebab-case-name}, filename: ${id}.${kebab-case-name}.${ext} } }, leetcode.showDescription: true, leetcode.editor.shortcuts: [submit, test, star, solution], leetcode.hint.commandShortcut: false, leetcode.hint.configWebviewMarkdown: false, leetcode.enableStatusBar: true }4.1 endpoint站点选择是第一优先级这个配置决定插件连哪个站点取值通常是leetcode和leetcode-cn两种。选错的典型症状是登录显示成功但题目列表拉出来是空的或者题目编号对不上。判断方法很简单你平时在哪个站点刷题就选哪个。切换之后记得清一次缓存因为题目数据是按站点分开缓存的不清的话可能看到的是上一个站点的残留数据。4.2 workspaceFolder 与 filePath文件生成规则workspaceFolder是题目文件的存放根目录必须是一个已存在的绝对路径。插件不会自动创建这个目录路径写错了会静默失败——这是新手最容易卡住的地方明明配置写了点开题目什么反应都没有八成就是这个目录不存在。filePath决定生成的文件怎么命名和分目录支持的变量包括变量含义示例第 1 题 Two Sum${id}题目编号1${name}题目原名Two Sum${kebab-case-name}短横线连接的小写名two-sum${camelCaseName}小驼峰twoSum${PascalCaseName}大驼峰TwoSum${snake_case_name}下划线小写two_sum${ext}文件后缀py${difficulty}难度Easy我用的规则是目录1-two-sum、文件名1.two-sum.py。用编号开头的好处是文件管理器里天然按题号排序找题的时候不用回忆标题用 kebab-case 而不是原始标题是因为有些题目名里带括号和逗号直接拿来做文件名在 Windows 上会有问题。如果你想按难度或者标签分目录可以把 folder 改成${difficulty}/${id}-${kebab-case-name}这样目录结构直接就是Easy/、Medium/、Hard/三棵树一眼看到自己哪块薄弱。4.3 defaultLanguage默认语言与扩展名映射defaultLanguage决定生成文件用什么语言可取的值包括python3、python、java、cpp、c、javascript、typescript、go、rust、ruby、swift、kotlin、scala等等具体以插件版本为准。这里有个经验如果你在准备面试建议把默认语言设成你面试时最可能要手写的那门而不是你最熟的那门。我见过不少人平时用 Python 刷得很顺面试要求 C结果手写#include都要想半天。用插件生成 C 骨架至少vector、unordered_map这些常见类型的写法学得更扎实。如果你确实需要多语言对照一个办法是给不同语言配不同的workspaceFolder用多个工作区分别管理另一个办法是同一道题手写第二个文件命名上加语言后缀插件不会管这些额外文件。4.4 几个容易被忽略但很有用的开关leetcode.showDescription控制是否把题目描述写进生成的文件。开着的好处是脱离网络也能看题坏处是文件会变长写代码时要往下滚很久。我的做法是打开它但在文件里用区域折叠标记把描述包起来默认折叠需要时展开。leetcode.editor.shortcuts定义编辑器右上角显示哪些快捷操作按钮。可选项一般有submit提交、test测试、star收藏、solution看题解、description看描述。我建议至少留submit和test因为这俩是高频操作鼠标点一下比开命令面板快。leetcode.nodePath用来手动指定 Node 可执行文件路径。前面提到 nvm 用户和命令找不到的情况填这个能直接解决Windows 下类似C:\\Program Files\\nodejs\\node.exe路径里的反斜杠在 JSON 里要写两个。leetcode.useWsl是给在 WSL 里开发的人准备的。如果你在 VSCode 里用 WSL 远程模式做开发把这项打开插件会走 Linux 侧的运行环境。不开的话可能出现文件夹路径被识别成 Windows 路径、文件生成到奇怪位置的问题。注意改完配置后如果没生效别急着重装插件。先执行一次Developer: Reload Window重载窗口配置项在部分版本里需要窗口重载才重新读取。5. 从选一道题到通过提交的完整实操5.1 打开题目与生成文件点开左侧 LeetCode 面板顶部有几个筛选入口难度、状态未做/尝试过/已通过、标签、列表。想看热门题目就进对应的题单想随机练一道就执行LeetCode: Pick One它会从你设定的范围内随机挑一道没做过的题。选定题目后右键选择Show Problem插件会在workspaceFolder下按你配置的规则生成文件并在编辑器里打开。生成的文件结构大概是这样leetcode/ └── 1-two-sum/ ├── 1.two-sum.py └── 1.two-sum.md // 题目描述取决于 showDescription 配置Python 文件里通常长这样# # lc appleetcode.cn id1 langpython3 # # [1] 两数之和 # # lc codestart class Solution: def twoSum(self, nums: List[int], target: int) - List[int]: # lc codeend那两行lc codestart和lc codeend非常关键插件靠它们识别哪段是要提交的代码。如果你不小心删掉了提交时会报格式错误或者把整个文件都发上去。同理在标记之外的地方写本地测试代码比如自己加的if __name__ __main__提交时不会被带上去这正是设计意图。5.2 本地编写与调试写完主体逻辑之后别急着提交先在本地跑一遍。最省事的方式是用插件自带的测试功能。点编辑器右上角的Test按钮或者命令面板执行LeetCode: Test Solution它会在编辑器下方弹出一个输入区让你按格式填用例。Python 的场景下一般是这样nums [2,7,11,15], target 9 nums [3,2,4], target 6插件把这段发到服务端跑返回每个用例的期望输出和你的实际输出。这个方式的优点是格式统一、不用自己构造数据结构缺点是每次都要手动输入用例很多时比较烦。想要更彻底的本地调试就得借助语言环境。以 Python 为例把插件提供的 Solution 类复制到临时脚本里自己调用if __name__ __main__: s Solution() print(s.twoSum([2, 7, 11, 15], 9)) print(s.twoSum([3, 2, 4], 6))配合 Python 扩展的调试器打断点单步看变量变化这才是排查逻辑错误最有力的手段。C 用户则需要先配好编译器MinGW 或 clang用tasks.json定义编译任务再用launch.json定义调试配置这块内容网上教程很多核心就是让编译产物和调试器路径对得上。还有一种取巧的办法是装一个代码运行器类扩展右键直接运行当前文件适合写不来launch.json的新手。缺点是不支持断点调试只能看输出。提示不管用哪种方式本地测试跑完之后记得把自己加的测试代码删掉或者移到lc codeend之后。虽然插件提交时只取标记区间内的代码但留着测试代码会让文件越来越乱复习的时候干扰很大。5.3 提交、查看结果与记录归档确认本地跑通后点右上角Submit或者命令面板执行LeetCode: Submit Solution。提交过程大概一两秒到十几秒不等返回的结果面板会显示状态通过 / 解答错误 / 超出时间限制 / 超出内存限制 / 编译错误 / 运行错误通过的话显示运行时间和内存消耗以及击败了百分之多少的提交失败的话显示具体是哪一组输入挂了以及期望输出和实际输出。这里有个细节值得注意运行时间和内存消耗这两个数字在不同时间提交波动很大别太当回事。你看到击败 30%可能只是因为抽到的机器负载高而不是你的算法真的慢一个量级。真正判断复杂度还是自己分析时间空间上界或者本地做大规模数据压测。提交通过之后我会做两件事。第一件是在文件顶部补一段自己的思路注释写清楚用了什么方法、关键点在哪、复杂度是多少下一次回看时不用重新推导。第二件是执行 git 提交提交信息写成feat: 1.two-sum 哈希表 O(n)这种格式把方法和复杂度带进去几个月后git log一拉就是一份完整的学习档案。5.4 用代码片段定制自己的函数骨架插件生成的骨架是标准化的但每个人的习惯不一样。比如我写 Python 时习惯在函数里先处理空输入写 C 时习惯先写ios::sync_with_stdio(false)。这些固定动作可以用 VSCode 的用户代码片段来自动补全。打开命令面板执行Preferences: Configure User Snippets选对应的语言文件加一段{ LeetCode Python Boilerplate: { prefix: lcb, body: [ class Solution:, def ${1:method}(self, ${2:args}):, # 边界处理, if not ${2:args}:, return ${3:None}, $0 ], description: LeetCode Python 骨架 } }之后在编辑器里敲lcb就能展开。这个方案的好处是跟插件完全解耦插件升级不影响你的片段而且所有项目通用。插件本身也支持读取自定义模板文件模板通常放在用户目录下的.leetcode文件夹里按语言命名。如果你希望生成的骨架就带着自己的风格可以去那个目录里改但要注意插件升级后模板目录结构可能变化改之前先备份一份。6. 常见问题与排查技巧速查6.1 高频故障速查表现象大概率原因处理方式点开题目没反应、不生成文件workspaceFolder 指向的目录不存在手动创建该目录确认路径无中文和空格登录一直转圈或提示超时网络出口不通、系统时间偏差过大校准系统时间浏览器验证连通性后重试题目列表为空endpoint 选错或缓存残留切换 endpoint执行 Clear Cache 后重进提交后提示找不到代码区间lc codestart/end标记被删从生成的原始模板里恢复这两行标记本地测试报找不到 node系统未装 Node 或 VSCode 未重载装 Node LTS完全退出 VSCode 再开或用 nodePath 指定文件生成到奇怪的位置配置了相对路径或路径分隔符写错一律用绝对路径JSON 里反斜杠写两个界面变英文、按钮消失插件版本升级后配置项改名重载窗口对照最新配置项名称调整 settings.json中文题目描述乱码编辑器默认编码不是 UTF-8设置files.encoding为utf8并把files.autoGuessEncoding打开6.2 网络与超时这一类问题怎么定位这一类问题的共同点是不知道自己哪一步错了。我的定位套路是先分层再收窄。先确认基础连通性浏览器能不能打开站点。能打开说明网络层没问题问题在插件的会话或者缓存打不开那就别折腾插件了先把网络搞定。再确认时间系统时间偏差超过几分钟服务端的会话校验就会失败表现是登录成功但所有操作都报权限错误。这个坑很隐蔽尤其是长期不关机、休眠唤醒后时间漂移的机器。然后确认会话Cookie 是有有效期的一般几周。如果你的症状是前几天还好好的今天突然要重新登录那就是会话过期重新获取一次即可。反过来如果今天登录明天就失效那可能是同一账号在别处登录导致会话被顶掉。最后确认缓存命令面板执行LeetCode: Clear Cache把本地数据全清一遍重来。这个操作没有副作用只是下次拉题目会慢一点排查时值得优先试。6.3 多账号、多工作区与数据迁移如果你同时维护两个账号比如一个练手一个备赛插件同一时间只能保持一个登录态。切换账号的流程是先Sign out再清缓存再Sign in。不清缓存直接换账号可能出现题目状态串号的情况已完成标记会显示成上一个账号的数据。多工作区的场景更常见你在家里用一台机器刷题在公司用另一台。想让两边配置一致最省事的办法是打开 VSCode 自带的设置同步把扩展和设置一起同步过去题目文件本身则用一个 Git 仓库托管两台机器分别 clone 到同一个绝对路径下。注意路径必须一致否则workspaceFolder在另一台机器上就指错了。如果你的题目仓库已经积累了很多题换机器时不要直接复制node_modules之类的构建产物Python 和 JS 场景下有些题目目录里会有用.gitignore排除掉只同步源码和笔记。我在仓库根目录放了一份这样的忽略规则# 依赖与缓存 __pycache__/ *.pyc node_modules/ .vscode/.ropeproject/ # 本地环境文件 .env7. 把这套环境用得更顺手的几个进阶玩法7.1 用 Git 分支组织专题训练题做多了之后一个平铺的目录会变得难以检索。我的做法是把主干当流水账每做一道题直接提交到main同时按专题开分支比如topic/binary-search、topic/dp在一个分支上集中刷某一个标签的题目刷完再合并回主干。这样做的好处是复习时目标明确。想巩固二分查找切换到对应分支git log --oneline一眼看到这个专题下所有题的解法演进。合并回主干的时候如果有冲突说明同一个文件改过两次正好是个提醒——回去看看自己第二次的解法是不是比第一次更好。标签对应的题单可以直接在插件的筛选面板里找。按难度、按标签、按列表筛选都很方便热门题单、面试高频题单都在里面。选好范围之后用Pick One随机抽题比按顺序从第一题往下做更接近真实面试的状态。7.2 给每道题写一段复盘笔记我不建议把复盘写在代码注释里因为代码会改注释容易过时。更好的做法是每道题配一个同名的 markdown 文件固定写三段思路、易错点、可优化的方向。固定格式的价值在于可检索。时间久了之后你可以用全局搜索找所有提到边界条件的笔记把这些高频失误点整理成一张自查清单面试前扫一遍比重新刷题效率高得多。这类笔记文件同样纳入 Git 管理跟着代码一起提交。如果想让笔记和代码的关联更强可以在代码文件顶部写一行指向笔记的相对路径注释按住 Ctrl 点击就能跳过去。VSCode 对相对路径的识别很准markdown 也能直接预览形成代码—笔记双向可跳转的结构。7.3 本地做规模压测别信服务端那个百分比服务端返回的运行时间受机器负载影响波动很大。想真正验证自己的算法上界可以在本地造数据压测。比如写一个生成随机数组的脚本规模从 1e4 到 1e6 逐级往上跑用time命令或者 Python 的time.perf_counter()打点画出耗时曲线。import random import time def gen(n): return [random.randint(-10**9, 10**9) for _ in range(n)] for n in [10**4, 10**5, 10**6]: data gen(n) start time.perf_counter() # 调用你的解法 elapsed time.perf_counter() - start print(fn{n}, cost{elapsed:.4f}s)曲线接近线性说明是 O(n)规模翻十倍耗时翻百倍那就是 O(n²)这时候再回头优化。这种验证方式比盯着击败 87%有意义得多也更能帮你在面试里把复杂度分析讲清楚。7.4 把插件当检索工具用而不是只当提交入口很多人装完插件只用生成文件 提交两个功能其实它的筛选和检索能力更值得用。按标签筛出所有没做过的中等难度题、按状态筛出尝试过但没通过的题回头啃、按题单跟着系统化的路线走这些用法能让刷题从随机撞题变成有计划推进。我自己的节奏是每周固定挑一个专题从未做里筛出该标签下的题集中做完写笔记进 Git然后再换下一个标签。周赛那类限时训练则单独用一个工作区跟日常刷题的文件分开避免节奏互相干扰。关于这个配置我个人最真实的体会是头一小时花在环境和配置上的时间绝对是划算的。我最初偷懒直接用默认配置结果文件全堆在一个目录里、命名带空格、路径还有中文刷到第五十道题的时候根本没法检索最后花了一个晚上重新规划目录结构、批量改文件名、重写.gitignore比一开始就配好累多了。所以如果你正准备开始建议先花十分钟把workspaceFolder和filePath这两个配置想清楚一步到位。另外一个小技巧是配置改完之后拿一道最简单的题比如第一题完整走一遍生成—本地测—提交—提交 Git的流程确认每个环节都通了再开始正式刷题避免刷到一半发现某个环节有毛病又要停下来排查。