online judge对于提升编程能力有非常大的帮助,在2015年年初的时候笔者接触到了OJ,由于本身基础比较薄弱,因此在许多人眼里的“刷”OJ,对我而言变成了“啃”OJ
相信许多同学和笔者一样是在强烈的危机感驱使下开始刷题的,但是无论出发点是什么,对基本算法和数据结构的掌握对于一个从事技术的人而言是重中之重,笔者在学习machine learning时发现在做research之前首先得达到一个programmer的高度,实习的时候亦有这样的感受,coding skill体现的不仅仅是你严谨的逻辑,更体现了解决和分析问题的能力,其重要性不言而喻。Leetcode上面的每道题都值得仔细推敲和分析,并且温故而知新才是好的学习习惯
我的leetcode心得与体会: 从15年5月刷到11月,中间暂停了将近两个月,速度上而言完全不算快,从200多题按照题号往回刷,明显感觉题号小的题偏基础一点,因此现在感觉按照从小到大的顺序或者按照分类来做题是比较科学的做法,有点不同的是笔者全程用python刷题,c++ stl用的不是很熟。
- 刚开始的时候觉得特别虐,一道题如果没有思路的话会想很久,由于笔者强迫症症状比较严重,不到万不得已不看答案,所以刚开始的几天特别痛苦,基本一道medium都会想很久(hard更是难上加难),记得一道dungeon game卡了我两天还做错了……
- 其实如果对于基本的算法框架比较熟悉的话很快就能有思路,像Number of Islands这样的题目第一反应就应该是dfs,所以我开始尝试理清一些基本的算法框架,如dfs,bfs,dp,递归和回溯等等,并且从别人的代码中总结一些框架性的方法
- 另外除了算法之外一些基本的数据结构也必须熟悉,如堆栈、链表、二叉树等等,但是这些数据结构相关的题解法基本比较固定
- 最难以捉摸的题型是数组与字符串,leetcode上数组的题目占的比重最大,在笔者看来数组不能被归为一个类别,因为题目跨度很大,基本会涉及dfs、dp、hashtable、sort等等,还有许多比较独有的解题方法,如trapping rain water和Best Time to Buy and Sell Stock一系列等等
- 做完题AC之后应该注意一下自己的耗时,多分析一下自己的时间复杂度和空间复杂度,如果比较低效并且没有什么好的优化方案的话建议去看看discuss里面的解法,有许多巧妙的解法可以开阔思路
- 随着时间的推移,编程会逐渐变成习惯,并且可以明显的感觉到自己的归纳和推理能力有很大的提升,现在看到一道题基本都会有比较直观的解法,如果确定了用什么算法解,那么基本的代码框架其实也已经出来了,但是说到底leetcode考察的是对算法的熟悉程度和动手能力,你写的代码在实际工作中并不一定会用到,写代码更多的是培养良好的编程习惯。
- 刷leetcode免不了有一点“应试”的感觉,其实国内的许多面试或者笔试题大同小异,基本面试官问的题目如果和刷过的题目有交集的话相信自己会胸有成竹,而就算是一道完全新的题目其实也不太可能偏离基本的算法,展现自己解决问题和代码实现的能力才是最重要的。
最后有一点:如果你不是oj爱好者,那么费尽心思去刷很多题并不是必要途径,“质”比“量”更加重要,没有必要非得把所有题全部刷个好几遍,能从自己做过的题中总结出属于自己的方法在笔者看来才是最重要的,毕竟刷题只是手段不是目标,能培养自己推理思维和逻辑性才是在以后的学习工作中起到真正的关键作用。
最后贴下自己的战果,最近更新了好多付费题,加之最近忙其他事因此没有来得及跟上。