技巧篇|周末使用Clion愉快刷题 Leetcode(C++)吧
痛点
通常我们在 Leetcode 刷题的时候,如果某个用例出错或者触发边界条件,我们只能用肉眼看,并一遍一遍的推导,如果我们想在 IDE 中写代码或者调试的时候,又会发现有些数据结构在本地没有定义,自己需要将用例数据(通常为字符串)转换为函数形参类型,当我们做完这一切发现,还需要定义一个 main
函数才能愉快的开始运行或者调试,等你做完这一切可能你的刷题的三分热度早已消磨殆尽。
改进
为了能减少重复工作,愉快的开始刷题,最后总结出了一套个人觉得很方便的刷题环境,让我们一探究竟吧。
工具或源码
本项目需要以下工具或源码
- Clion
- C/C++ Single File Execution 在 CMake 项目中,如果想要构建和运行单个 c/cpp 文件,需要在 CMakeLists.txt 需要配置声明
add_executable()
,使用这个插件可以轻松构建和运行单个文件。 - LeetCode Editor 可以在 Jetbrains IDE 中轻松查看题目,提交题目等。
leetcode.h
基础数据结构和来自于Leetcode Playground方便我们将测试用例字符转化为正确的参数。stdc.h
大家用了都说好的"万能头"文件,主要为了方便主动导入,也可以自己按照所需维护一个头文件替代。
leetcode.h 和 stdc.h的源码可以在 gist 获取
配置
首先使用Clion创建一个C++默认项目,并将 leetcode.c & stdc.h 在 gist 下载后放置在根目录下,如下图所示。
设置 Leetcode Editor,你可以点击 Leetcode 图标唤起面板,然后点击 Settings 按钮进入,然后根据图中配置,主要的配置项有以下几个
- CodeType 设置为 C++
- LoginName & Password 根据实际情况填写
- TempFilePath 需要设置为项目根目录,根据你的项目目录调整
- Custom Template 需要勾选 True
- Code FileName =
leetcode_num_${question.frontendQuestionId}
- Code Template复制以下的代码,简单分析一下就是我们通过导入 stdc.h 和 leetcode.h(在stdc.h中被导入)头文件,避免了我们需要根据代码手动导入头文件,由于 leetcode 中的题目大部分都是定义了一个
Solution
类,如果在一个项目中引入多个题目会导致类重复定义错误,所以我们根据题号创建不同的 namespace ,这样就避免了重复定义,并使用了 using 语法简化了调用,美中不足的是我们并没有自动构建对题目的调用和对测试用例的代码编写,这就是需要我们手动参与的地方,不过有了 leetcode.h 的加持,这一些也不是难事,在下文我们会展示如何使用。
//import universal *.h
\#include "../../../stdc.h"
using namespace std;
${question.content}
namespace solution${question.frontendQuestionId}{
${question.code}
}
using namespace solution${question.frontendQuestionId};
int main() {
Solution solution = Solution();
return 0;
}
配置完成后,点击任意题目后,就会生成下图所示的目录结构(这是按照Java的目录结构生成的,对我们并不影响)
,观察生成的源代码文件,这个题目需要定义结构体
ListNode
在这里并没有出现警告,因为我们的 leetcode.h 已经包含了定义,这时候我们只要右键选择 Add executable for single c/c++
按钮并点击 CMake 刷新按钮,就可以在上方的运行按钮看到一个新的可运行 CMake Application
,到这里你就可以愉快的利用 IDE 的代码提示开心的刷题了。
利用编辑栏的悬浮窗口,你可以测试和提交自己的代码,如下图所示。
如果你提交答案被系统驳回,并告诉了你测试用例,你也可以很容易的去调试它,系统通常给我们的测试用例形如
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
,观察我们的形参,我们需要组合成 ListNode
,对于最后的结果 输出:[8,9,9,9,0,0,0,1]
我们最后的返回值为 ListNode
,有了 leetcode.h 现在不需要你去自己构建和翻译链表,stringToListNode
和 listNodeToString
轻松帮你搞定这一切。这样,一个题目就轻轻松松的跑起来了。
最后
leetcode.h 文件现在可能仅覆盖了链表和树结构,如果在刷题过程中遇见其他数据结构,欢迎贡献你的一份力量。
如果您有更方便的思路,欢迎和我交流。祝大家周末快乐!刷题快乐!
欢迎关注公众号“简绘Android”获取更多姿势!