本地 leetcode,支持断点调试
1. 关于 EPI
EPI 是英文 Elements of Programming Interviews 的缩写,这是一本外国人写的算法书籍(介绍 / pdf 下载)。该书籍在编排上,以数据结构作为划分,每种数据结构独立一个章节,每个章节都包含数道算法题和作者的解答。
2. EPI 的优势
相较于 leetcode 等在线刷题网站,EPI 的优势主要在于:
- 1)、题库本身就带有解题思路和对应的代码,存在多种解时由浅入深地展开
- 2)、配套的开源项目 EPIJudge,直接在本地做题(支持 Eclipse 和 IntelliJ IDEA),无需联网且支持断点调试,做过的题目直接记录到代码仓库中
- 3)、配套的开源项目 elements-of-programming-interviews,将题库按章节做成了清单列表,做完一题勾选一题,实时掌控进度
3. EPIJudge 使用介绍
- 1)、进入项目 github 主页,folk 一份到自己的仓库
- 2)、将 folk 后的仓库克隆到本地
- 3)、将题库导入到 InteliJ IDEA(视频教程) 或 Eclipse(视频教程)
- 视频教程在 youtube,需要翻墙才可访问
- 如果没有梯子,可以查看 IntelliJ IDEA 官方导入教程
- 在导入时,选择 epi_judge_java 文件夹(epi_judge_java_solutions 文件夹为带解答的工程)
- 4)、刷题,编写代码 + 调试,直到验证通过
- 5)、提交并推送解答到远程仓库
4. elements-of-programming-interviews 使用介绍
- 1)、进入项目 github 主页,folk 一份到自己的仓库
- 2)、将 folk 后的仓库克隆到本地
- 3)、每刷完一题,就打开对应章节的 README.md 文件,勾选上对应的题目
- 4)、提交修改并推送到远程仓库
5. 个人使用心得
- 1)、阅读书籍,按书籍中的出现顺序刷题,看到题目后先自己思考一下,不要马上看答案
- 2)、每一题都自己写一遍,写完后过一会还原代码再写一遍,两遍都通过后才提交
- 3)、断点调试时,可以临时添加一个全局的 static 变量 num 用于标识测试用例的编号,在代码实现的方法入口处添加 num 的匹配打印代码,然后将断点断在打印语句上,如下方的代码示例(测试用例一般都有成百上千个,如果是在中间出错,不用这种方式很难调试)
$ git diff epi/Anagrams.java
diff --git a/epi_judge_java/epi/Anagrams.java b/epi_judge_java/epi/Anagrams.java
index 1edc721..c68bbf3 100644
--- a/epi_judge_java/epi/Anagrams.java
+++ b/epi_judge_java/epi/Anagrams.java
@@ -10,6 +10,7 @@ import java.util.List;
import java.util.function.BiPredicate;
public class Anagrams {
……
+ /**
+ * 测试用例的编号
+ */
+ private static int num = 0;
@EpiTest(testDataFile = "anagrams.tsv")
public static List<List<String>> findAnagrams(List<String> dictionary) {
+ // 未通过的测试用例编号匹配(实际编号从 1 开始,出错时日志输出会告诉我们第几个未通过)
+ if (++num == 5) {
+ // 将断点断在下面的打印语句上
+ System.out.println();
+ }
// TODO - you fill in here.
// 具体的算法代码实现(省略)
……
}
……
}
- 4)、分享我的解答
- 5)、即使不刷题,深入研究 EPIJudge 的设计思路(进而掌握验证算法是否通过的实现原理 / leetcode 等网站的原理应该也是一样的)也是一个不错的选择
- 6)、即使不刷题,elements-of-programming-interviews 列清单的思路也是很值得借鉴的一种学习方法
6. 总结
算法不是短时间可以速成的,所以有吸引力的公司为了筛选优秀人才基本都会将其作为必考项。为了不让这一关限制了我们的选择面,还是越早打通越好。
单纯的背题效果比较一般,最好的方法还是自己手写一遍,修改 + 调试,直到验证通过。
最后,以《卖油翁》的话做为结束:“我亦无他,唯手熟尔”。