刷leetcode带来了什么
序言
最近开始尝试刷leetcode,最直观的感受是:你可以知道自己最擅长和最不擅长解决什么问题。我是擅长解决关于字符串的问题,最不擅长解决排列,回溯,搜索问题。
解决排列问题
一个很常见的面试题:从一个数组中找出和为sum的全部排列。现在还能记得那时候的想法:加加加如果大于和了怎么办?要退回去呀…这个“退”让我想起了迷宫问题,于是就朝这方面想办法,but结果可以预想。一开始的错误会让你永远都找不到答案。
再次思考这个问题,我想:一个一个循环找答案吧。抱着这个想法去找还有没有更好的方法。得到的答案也是这样的,不过里面得到的一个很重要的point:“剪枝”。就像之前看到的找八皇后答案的过程一样:如果过程中遇到不满足结果的答案,及时剔除。
同时,提交的答案,也会把程序的速度和空间复杂度展示出来。印象很深刻的一个题目是排序列表,题目中给的tip是不要尝试交换值。不过只是我第一想法,于是我就这么做了,但是达到的复杂度真的是差强人意。于是我开始尝试改变next的指向来进行排序,效率真的大大提升。
测试驱动开发
很喜欢“测试驱动开发”这个观点,我看到题目会先将测试用例加上,在尝试写code。但是通不过测试,到底是为什么?这个时候,开始打日志,看问题到底是出在哪?还记得之前看过的:如何调试自己的代码?首先是看。看到底是哪里出错了。打日志得到的错误区域可能会帮你定位bug。但是给我的感觉就是很乱,我只是着眼于这一处,改的时候也是只关注这一点,可能的后果是其他地方除了问题。看是第一选择,实在是看不出来,再尝试debug。
边界处理
里面还有一个是边界值处理。跑过了测试用例,但是得到一个“wrong answer”的结果,定眼一看,原来是边界值的问题。等再次code,会有一个潜移默化的想法,想的全面。
待解决
到现在,对于排列的问题,我可以尝试去下手写,去寻找解决办法。开动脑筋,去找answer。最近没有解决的问题是大数处理和位运算。