前言
昨天的发了算法和数据结构后,很多人表示意犹未尽,感觉大公司都是要手写算法,那刷题是必不可少了,你技术再厉害,这关过不了,很多机会也会和你失之交臂,很多读者刷了不少算法去了头条,拼多多,薪资一下就double,比如之前20k,跳槽一下就40k,你说羡慕不羡慕。所以算法和数据结构,对程序员很重要。当然今天这篇文章不是来打广告的,而是小豪同学整理了一些刷题心得分享给大家,因为方法大于勤奋,他15年毕业,之前一直在某TMD某家,刷了一个半月算法题,目前跳槽去了头条,薪资38k(多少k,他和我,没有利益相关,小豪同学满意就行)。小豪同学说这些心得有参考网上的《不羁的程序员小王》和《畅雨潇潇_》大佬总结,所以这里特意说明下,下面进入正文:
不要为了AC而AC
第一次刷题还是大二,同学之间挺流行一个Java的经典编程50题,第一遍AC耗时一个多月,过程很痛苦有好几次想要放弃,看题不懂方法,很难理解他人方案,很多题目看了答案只是知其然而不知其所以然,从不考虑复杂度,都是暴力法直接解决,很多解题方法通过看别人的方案去归纳,照着抄。一个多月的时间自己算是入门了,第二遍的时候轻松很多。
现在看来刷题是没有技巧的,就是多做题多练多总结,对于很多新手不要去想是不是还有最优解什么的,你做的就是暴力法求解,刷题是很枯燥的,你需要给自己一点鼓励,当把题目解决以后再去考虑其他的,在你不能很快的解决问题的时候,可是试着写点伪代码或者画个流程图。当你经过大量的练习,会形成条件反射知道这是什么类型的题,用什么方法解决。
LeetCode刷题系列是按照某个专题进行的,这样对比着刷题效果是比较好的。千万不要耍小聪明用一些奇巧淫技,思路不对再怎么绕都是浪费时间。
遇到问题多找轮子,一定有人跟你一样菜遇到过同样的问题,同样不要想着自己造轮子,绝大多数问题前辈一定有更好更完善的方案在,自己造轮子费时费事又没太大意义。
一定要自己动手实现,看答案和自己做是两回事,自己做一遍以后会加深对问题的理解。没必要把所有算法都精通,但起码在遇到问题时可以找到最优算法解决问题。即知道算法的存在及其用途,按需深入学习。
最重要的一点坚持下去,最简单且最难的事情就是坚持,每天刷一个题保持良好的手感,时间不用长了,一个月你会有非常大的进步。
刚开始刷题的时候,基本上一下午只能A过两三道easy的算法题,但是我在每次A过之后,都会在讨论里看看别人的算法,把自己觉得叼炸天的算法记录下来,尝试理解别人的算法。这种做法给我带来的最大好处是:增强自己的代码阅读能力,并且开阔了我的思路。
先写思路,再写代码
在A题的过程中,我从没用过IDE编译代码看输出,基本上都是肉眼debug,然后改错。这个方法是我在A题时别人建议的,这样可以锻炼自己的思维能力,也可以慢慢提高自己写代码的全局观和对异常输出的处理。
一开始刷题时,我都是有一点思路就尝试开始写代码,写着写着发现这种方法不可行,又全部删掉。后来慢慢变成了先在纸上写好完整的思路,甚至包括需要声明几个变量。这样虽然一开始可能觉得速度有点慢,但这样会让你在真正写代码时思路清晰,从而少犯错误,并且我觉得这种写代码的状态更好。到后来我在写算法的时候甚至不是从上到下的编写,而是先写算法的框架,再写每一个部分要完成的功能。自我认为,这是比较好的敲代码的方法,并且可以增加自己纸上代码的能力。
关于测试用例,一般我都是随便试两个,通过了就直接submit,但是这样导致我的AC率很低。后来改成先写思路的时候,我就先想测试用例,而且想一些极端的,并根据 这些测试用例来写代码的一些边界条件和保护条件,这样AC率也会慢慢高了。
最后,一定不要满足自己的算法,尽可能写出最简单的代码,即使是相同的思路,也一定要将代码减至无法再减为止。这样可以增加自己的代码质量,久而久之,你对这门语言的掌控能力也会得到提升。
刷题是可以锻炼的,千万不要让算法成为自己的短板。
欢迎关注我的微信公众号「码农突围」,分享Python、Java、大数据、机器学习、人工智能等技术,关注码农技术提升•职场突围•思维跃迁,20万+码农成长充电第一站,陪有梦想的你一起成长。