LeetCode 是如何运行的--测试篇
初
有段日子没写博客了。 一般情况,四张图加上 140 字能表达的内容我就直接发推了,想到这个可能会超过这个长度,就写在这里吧。 当然有个前情提要,感恩 GitHub Issues 的双向链接,
- 我只需要 #205 大家就可以直接看到上一篇的相关文章了 --《力扣的程序是如何运行的》,我昨天自己也看了一遍哈哈。所以这篇的格式也会跟上一篇一样。
起因
最近心血来潮决定去刷几道题,上一次也是第一次刷题还是 3 年前了。
刷题的过程中感觉到了自己的不足。写完代码就直接提交了,结果很多时候是错的。也发现了 LeetCode 有先测试功能,需要自己写测试用例。 编了几个之后突然想,为什么我不能用官方的测试用例呢?那样不是更方便。搜了一下发现是没有的,并且这个需求还是有人提过的
- https://leetcode.com/discuss/general-discussion/635684/option-to-view-all-the-testcases
- https://www.quora.com/How-do-I-get-all-the-test-cases-of-problems-posted-on-LeetCode/answer/Vipin-Sharma-83
那么我能不能用我之前那篇文章的方法拿到 test case 呢?
探索
- 把上一篇流程跑了一遍,发现 LeetCode 改了一些东西,增加了一点安全措施,但上文的方法依然可用
- 观察 /mnt dir 下面的文件,
data.in
最奇怪了,那么我们能不能打开呢? - 完全没问题,里面的内容呢就是 test case...得到的好容易,在接口里也能看到,我们可以直接 print 那样就可以在 stdout 里看到了
继续探索
- 那么我能不能写个脚本把这些测试都拿下来直接生成所有测试用例呢?看起来很简单,但其实栽了
- 因为 LeetCode 的测试非常严谨,到后面的测试,比如字符串,它会用一个非常长的字符串,len(s) > 500000
print
根本是打不下的,LeetCode 也只会截取前面的,后面用...
代替 - 如果整个测试太长,最后面的也会被截掉,用还剩多少个字符代替,如图
- 尝试用
zlib compress + base64
给字符串压缩,同样失败,有一点点效果 - 继续尝试用
urllib.request.urlopen
能不能把data.in
发出去?不行,这个 docker 内部网是不通的 - 有其它方法么?有的,把长的字符串收集到 --> 分 n 次拿到 --> 最后保存。但是对普通刷题的朋友太麻烦了没有意义,感兴趣的同学可以自己尝试
意义呢
- 不想多次提交,我可以建一个小号,第一次去拿测试,然后复制粘贴到测试用例里,这样能保证大部分测试是可以的。
- 本地测试通过了再提交就 OK 了,也不用自己写符合 LeetCode 的测试了
- 今天我就用这个方式搞定了每日一题哈哈哈
- 周赛貌似会很有用
启示呢
- 做类似业务的朋友大多数也是 docker 起一个的方案,一定要小心,如果用户好奇会拿到你们许多信息的,连逆向都不用的。还有一定要小心 docker 逃逸的问题,LeetCode 能做到安全不代表所有公司能做到
- 以后自己也要多写测试
- 写代码,研究背后的原理,探索未知可比刷题有意思多了,我每次刷题最后都走偏。。。
- LeetCode 不去公布所有测试也是有原因的,通过这次我明白了
- 其实通过这个方式还能拿到一些 LeetCode setting 的限制,大家自己探索~
- 其它语言其实同理,我跑通了 go 的,大家可以用自己习惯的编程语言测试