自用 LeetCode 刷题流程
自用 LeetCode 刷题流程
刷 LeetCode 除了把题目做完,还包括了测试用例、整理代码等等繁琐的操作,磨刀不误砍柴工,今天分享一下我自己刷题的流程。
我做 LeetCode 的题目基本上不会使用 LeetCode 网页自带的编辑器环境,我主要使用 Swift 刷题,所以我都是用 Xcode 的环境来刷题。别人不用 LeetCode 自带编辑器的原因我不清楚,对我来说,主要就是菜,大部分题目我还是需要有一个单步调试的过程才能写完。
我会在本地创建一个和 LeetCode 中 Swift 模版一模一样的 Solution 类,这个类就是解题要用的代码,还要创建一个 main.swift ,作为测试和程序的入口。除此之外,LeetCode 还会有很多链表、树的题目,会涉及到 ListNode 和 TreeNode 两个类,所以我们最好也在本地提前建好这两个类的代码。完工后我的本地文件是这样的:

TreeNode 和 ListNode 的代码每次写相关题目的时候 LeetCode 都会给我们,也基本上不会有变化,我们只需要复制一次就可以一直重复使用了。但其实它给的代码不好用,以 ListNode 为例,如果我们要创建一个链表,我们要写如下代码:
1 | |
链表短还行,如果长了,写起来就是一连串的next、next,更别说如果要添加多个测试用例了。所以我给 ListNode 写了一个新的方法,通过传入数组就可以构造一个 ListNode。
另外还有一个问题,调试的时候无法使用 ListNode 的 description 属性简单的查看 ListNode 当前的值,例如一个链表依次由1-5的数字构成,我们希望直接能直接以形如”1 2 3 4 5“这样的格式来输出调试信息。如果直接使用 debugDescription 属性,只会看到 Optional(YourProjectName.ListNode) 这样毫无意义的调试信息,我们需要让 ListNode 遵守 CustomStringConvertible 协议,然后添加一个叫做 description 的计算属性,在这个计算属性中我们规定如何格式化输出一个 ListNode。
最终完成改造后,我的 ListNode 类长这样:
1 | |
这一次,再构建上文的 ListNode,我们只需要这么写:
1 | |
要创建测试用例集合也很容易:
1 | |
还可以方便的输出格式化的 ListNode:
1 | |
对于 TreeNode 类也可以进行类似的改造,这样改造过以后,对于我们在本地调试链表和树这两个类型的题目会带来极大的便利。
做完题目以后,我有整理代码,将所有做过的题单独放到一个文件夹并且上传到 GitHub 的习惯。解题的时候代码文件叫做 Solution.swift,整理到一起以后显然不能再叫这个没有意义的名字,对于一个题目我会标注题号,中文名和题目函数的名称,方便检索,例如第一题两数之和,我会将代码题解文件命名为 [1]两数之和TwoSum.swift,所有题目都使用这一个统一的格式。
问题来了,从工程文件夹将代码文件复制到我们汇总题解的文件夹、重命名文件、git add、git commit、git push 这一套操作并不优雅,更何况 git commit 的时候还要再写一次文件名,所以我用这学期学的 Shell 脚本语言写了一个脚本操作这一套流程,我只要执行写好的脚本,输入格式化后的文件名就行了。

脚本的代码非常简单,但是对我个人来说大大简化了工作流程,这一点上我还是挺满意的。
1 | |
这么改造完以后啥都好,就是不会做的题还是不会做。(完)