LeetCode 刷题隔天忘怎么办?
119 个回答
有意思的题目,基本上所有刷题的人都经历过这个阶段。
分享一篇刷题的经验给大家。全文 5000 字,建议先收藏或者双击标记。
很多人开始他的刷题之路因为各种各样的原因:进大厂、研究生复试或者参加竞赛拿牌,当然也可能是因为喜欢。其实不管你抱着何种目的开始,我希望你能一直在刷题这条路上走下去,毕竟除了提高自己解决问题和写代码的能力这种显而易见的好处,也能当作无聊时候的一种消遣...
其实随着刷题的深入,我发现刷题其实就是分为两步:
- 第一步有思路,即知道用哪种姿势怎么解题;
- 第二步是实现,即将你的思路转化为代码。
接下来我所有的废话都是围绕这两步来展开。
0x01 有思路
先说第一步:有思路。
算法题刷多了,你就会发现,最后其实在你脑子里记住的不是实现这道题的代码,而是解这道题的思路。
当我们刷了几百道几千道算法题的时候,你不可能记住每道题的代码,但是你可能知道这道题的思路,也就是出现类似“这道题我见过,我知道用这样那样的方法可以做出来”。有了思路,其实把它实现出来就是自然而然的事儿了,当然可能有人说知道了思路也不知道怎么实现,现在我先不说,这是我们下一步要讲的问题。
上面说的是我们要走到的目的地,那如何走上这条路,从而到刷题刷到思路“泉涌”呢?其实很简单,我们从小到大一直在被动习惯的四个字: 题海战术 。
题海战术,说白了就是多刷题,见多才能识广。
但这里的多刷题,不是指多瞎刷题,而是有方法的去刷。至于刷题的网站我已经在文章的开头放链接了,不知道去哪找题的可以看一下。
首先说什么是瞎刷题,就是看到一道刷一道,这是很多刚开始刷题的同学容易犯的毛病。
有的追求数量,刷了一堆简单题,沉迷在 AC 的快感中不能自拔,在深深的自我感动中依然菜的扣脚;
有的追求无脑,看到一道题就去网上搜答案,以为会解决问题,实则搜到了还看不懂,正好一劳永逸,给自己下了不是这块料的断言,成功的做到了开始即结束。
别问我为什么知道,我才不会告诉你当年我就是这样...
其实怎么用正确的题海战术,在我看来,其实也还是两步,第一步多题一解,第二步一题多解。
当然在此之前,我觉得你得先搞明白什么是时间复杂度和空间复杂度,不然不懂这些指标,你也不知道算法对于你当前题目的优劣。之前写过一篇旧文,有兴趣的可以看一下。
(PS:感谢大家耐心的阅读,算法是程序员的重中之重,必须攻克,大厂面试必考,顺便送一份阿里大佬刷Leetcode总结的算法笔记,如果你能吃透,那我相信80%的技术面试都会不在话下:
BAT大佬写的Leetcode刷题笔记,看完秒杀80%的算法题!
这本书的目录,非常经典:
0x01-1 多题一解
多题一解,就是把多种同类型的题先放在 一起来 做,也就是俗称的刷专题。下面是我当年刷题的一部分分类的截图:
很多大佬说做题要追求完美,一道题来 N 种姿势,但是对于刚开始起步的同学来说,一道题带着多解的思想包袱去刷,本身就是一种负担。你很难指望初学者能一上来就一题多解,没那么多见识,脑阔里没储备那么多的算法类型,能够暴力破解且跑通就已经是烧高香了。
这里再多提一嘴,关于网上搜答案这件事,答案可以搜,但是不要上来一看题,感觉自己不会就立马搜答案,要尝试思考,多在草稿纸上写写画画,实在想不出来再去搜。
搜到的答案我不希望你去看别人的代码,按照别人的代码一步步的写出来其实本身没有多大意义,真正有意义的是别人的思路,通过别人的思路来自己实现出现,这才是最应该做的。
这样做的好处是,你可以很快了解一种类型题目的做题方法,加深对某类算法的理解,总结出做题的套路,这算是一种抽象的概括能力。很多时候你就会发现,题目不过是在某类解决办法方面做加法减法。
0x01-2 一题多解
其实这个不用刻意去追求一题多解的能力,刷的专题多了,碰到的题目多了,自然而然你碰到一道题的时候脑袋里就会有想法,觉的可以这样做,也可以那样做,这个时候你就可以对比不同的时间复杂度和空间复杂度,选择当前的最优解法。
说一题多解,其实就是希望你在碰到一个问题的时候能够多想一步,一步一步再一步,不同维度不同姿势都尝试一下。刚开始这可能比较难,毕竟这涉及到一个改变,因为人都是有惰性的,毕竟只求一解比自找麻烦的求多解舒服多了...
题目见的多了你就会发现,很多时候你会碰到这种情况:A 题你有 5 种方法去解决它,改变它的某一个条件变成 B 题,作为 A 题的相似题 B,可能这个时候你照搬 A 的解法来解决 B,你只剩下 3 种或者更少的解法可以解决 B 题,如果你只会 1 种解法,刚好这种解法失效,那你就只能再另想它法。
所以一题多解的好处也是显而易见的,就相当于你的手里多了很多的选项,选项多了不管你在面试或是其它时候,都能手里有牌可打。
在这里我又要多提一嘴,追求一题多解并不意味着“不择手段”的追求题解数量的堆叠,也就是不要过分追求所谓奇淫技巧的解法,而这恰恰是许多同学容易犯的毛病,错误的认为了奇淫技巧等于水平高超,在我看来这个除了能引来别人一句卧槽的惊讶,从而带来一点内心虚荣心的满足以外,其余的用处不大,看个热闹就得了。
毕竟鲁迅先生曾经说过:“Use your best judgement”。
当然我也不是全盘否定技巧,但是你连个两三百道题都没刷完,你就在这给我讲你要技巧,我会认为你是在耍流氓...
0x02 实现
一道题有了思路,其实这道题的 90% 你已经解决了,把它实现出来按理来说就是自然而然的事儿了。
当然可能有同学知道了思路,但是就卡在这 10% 不知道怎么实现上,那这就是你写代码的能力问题,其实一样的,这就是不熟练,不熟练的原因就是练少了。
其实这个问题的唯一解还是所谓的“题海战术”,多练习,唯手熟尔。
刚开始的时候不管是书上的例题,一些简单的水题或者你想实现的一个简单的东西,按照你的想法写出来或者看一遍别人怎么写的,自己再一步一步的默敲,不要怕麻烦,一定要自己动手,不要看会了,我们都知道看会了其实不是真正的会。但是慢慢当你习惯了这种方式,你的代码能力会潜移默化的变强。
别问我为什么知道,我难道要说作为一个当年上了大学半年还没写过一次超过 20 行的代码的男人,经过一个寒假以后,能切百十行代码的题?
也太丢面儿了吧,说好的整个学霸人设呢...
0x03 第三步
咦?不是只有两步嘛,哪来的第三步?
嘿嘿,总得给能坚持看我说废话看到这里的同学开个小小灶不是...
其实还有两点是我想说的,而且这两点是我觉得在整个过程中最重要的。
0x03-1 做总结
怎么说呢,做总结这件事的好处,谁做谁知道,不信你就试试...
每道题有每道题的总结,每种类型的题有某类题的总结,千万不要怕麻烦,虽然刚开始的时候确实会很麻烦...
每每回想起来,我最后悔的就是在我刚开始刷题的时候没有做总结。当年集训队老师告诉我们每道题做完都要把题解发布到 CSDN 上,记录自己的思路,解题方式和代码。这件事乍一听我觉得太麻烦,觉得“有这个时间我多刷道题它不香嘛”,一直当作耳旁风。
后来真正开始在 CSDN 上发题解,并不是我突然顿悟,而是集训队老师看我们太懒,强制执行,然而这个强制,在经过初期的不适以后,慢慢的让我形成了做什么都要总结记录的习惯,一下子就写了 6 年。
0x03-2 保持热情
保持热情,不仅仅是能坚持,而要在坚持上最好能带有一点兴趣。刷题真的是一个很漫长的过程,如何在这个过程中能坚持下去真的很难做到...
我觉得你最好有一个最终的目标,这个很多开始刷题的同学肯定都有,不然没人闲着没事找事去刷题,有了最终的目标朝着这个方向去努力,同时把这个过程分成一部分一部分,比如拿刷专题来说,我这段时间刷链表,下段时间刷贪心,再下段时间刷 dp...
将目标量化为可衡量的每一段,自己有了掌控感,一步一步的向着最终的目标前进,知道自己离着还有多远,不至于半途而废。
拿我自己来说,当年搞 ACM,半年以后我已经准备放弃了,那段时间完全迷茫,觉得自己水平很差,没有机会去参加比赛,不可能拿到奖牌。那段时间我开始去寻找别的出路,去参加 Python 的社团,准备转去做项目。
浑浑噩噩了一圈,最后还是回去做 ACM,一方面是不想让自己半年的努力付诸东流,对拿牌子的执念,更多的是我发现坐在那写项目和做题比起来,我更喜欢 AC 的快感。
0x04 写在之后
以上就是我的一点点经验,其实没有什么新鲜的,有点啰嗦,也不一定能让你有什么进步。我一直觉的只要我们付出了时间和努力,开始向更好的方向迈出第一步,我们解决问题和写代码的能力就会潜移默化的提高。
在这个过程中,收获的远比去解决问题更有成就感,当然这种感同身受更多的需要你自己在这个过程中去体验。
可能末了整篇文章最有价值的只有四个字 - 题海战术。
希望你在变好的路上越走越远...
最后,如果你对学算法感兴趣的话, 可以查看简介一起交流学习算法 :)
原文链接: https:// mp.weixin.qq.com/s/_VHg IhBT4aFjG5FC6P4NWA
原文作者:Rocky0429
@Rocky0429
2021年04月29日补充:
不知道你们一开始刷算法题的时候是否有过如下的困惑。
- 1、题目很长,半天看不明白是什么意思
- 2、明明看懂了题目,但写出的代码却提交不通过
- 3、代码写到一半发现不知道怎么往下写了
- 4、别人的题解一看就懂,但自己想破脑袋都想不出要用这种方法
- 5、即使刷了两百多道题目,面试的时候一紧张还是会头脑空白发慌
你问我为啥知道这些?因为我都经历过。
我们都是从应试教育中厮杀出来的,所以对刷题应该是挺熟悉的,缺的只是方法,人人都可以是小镇做题家。
方法是什么呢?
可以归纳为两个,一个是战略,一个是战术,犹如行军打仗,两手都要抓。
在战略上,我们需要做到的是藐视算法题。
在战术上,我们需要做到的是重视刷算法题。
一、战略上藐视算法题
在战略上藐视算法题的目的是为了在心理层面上克服恐惧,事实上,不仅仅是算法题,诸如学习计算机基础、计算机网络、编译原理等程序员必备的知识时,有这个心态可以学起来事半功倍。
我亲身经历过这样的改变。
作为一个转行程序员,在转行学习编程的那段日子,没有人告诉我说要去学数据结构,也没有人告诉我说要去刷 LeetCode,都是靠自己一个人摸索,绝大部分的时间都花在具体项目上,误认为自己和那些已经工作的程序员的区别在于有没有做过项目。
这就是科班出身和非科班出身的学生最大的区别,科班出身的学生知道去学什么,知道大学期间安排的每一门课程是干什么的,知道要先去做哪些小项目来循序渐进的编码练习,知道知识点在工作中能起到什么样的具体作用,非科班出身的程序员感觉计算机相关的知识点简直是一团乱麻。
这种情况导致我去找工作参加面试的时候,很多基础面都通过不了,最后侥幸进入一家要求不太高的创业公司,薪资不高,为了进大厂必须完善算法和计算机的知识。
因为未知,所以恐惧,恐惧导致盲目的崇拜,我认为那些科班出身的程序员太牛逼了,居然可以掌握那么多繁杂的计算机知识;那些写源码分析的程序员都是大神;那些写算法题解的程序员都是高手。
恐惧把小的问题放大,比如学到单调栈、双向链表、记忆化的内容,一看到题目要用到这些概念便觉得代码很难写,索性那些内容就不看,所以学了大半年还在原地踏步,还在原来的公司拿着微薄的工资做着 CURD。
几个月后,创业公司不行了,受迫于重新找工作的压力,只好咬着牙再去啃,再去刷题。
而当我开始写题解、做动画的时候,我就发现算法题也就那样,缺的只是时间去不断的重复练习。
单调栈无非就是在栈的概念基础上增加了排序,记忆化也就是增加一个数组用于存储,动态规划在面试和实际工作中用到的只需要掌握百分之五就行。
抱着编程技术也就那样的心态,学习了爬虫以及 Vue。
“自大”的认为爬虫能有多难,基本步骤无非以下几步:
- 1、找到需要爬取内容的网页URL
- 2、打开该网页的检查页面
- 3、在 HTML 代码中找到你要提取的数据
- 4、写 Python 代码进行网页请求、解析
- 5、存储数据
下载安装 Pycharm,安装 Scrapy,根据步骤输入 URL 和数据格式,在完全不懂分布式、ip代理、js加密、模拟登陆、MongoDB的前提下,顺利拿到了自己想要的数据。
无论是分布式还是ip代理,爬虫的每个知识点深挖下去都大有文章,我所学习到的爬虫知识只是冰山一角,但这并不妨碍我们可以从战略上去蔑视编程,编程的很多内容没有那么高不可攀,缺的只是时间去学习,时间恰恰是我们可以去支配的。
二、战术上重视刷题
战术,分为道与术。
道
回顾一下我们以前学数学的过程,会发现,数学题有千千万,最后在脑海中记住的并非是这道题的具体写法,而是解这道题的思路。
算法刷题同样如此,很难做到让你把做过的题目代码都背下来,然后在面试的时候一五一十的写出来,但是你可能知道这道题的思路,用什么样的数据结构和什么样的算法思想,知道可以用这样那样的方法做出来,差的就是细节。
也就是说,刷题和应试教育中的学习是一样的,都需要先经过大量刻意的重复练习,见多识广,才能在面试时做到游刃有余。
说白了,就是要多刷才行。
这里的多刷题,不是指多瞎刷题,而是有方法的去刷,有目的的练习,而一个合理的练习方式,比练习的时间长短,更为重要。
如何做到有目的的进行练习,大概可以分为以下五个步骤:
1、找到具有定义明确的具体特定目标 2、具有专注练习的状态 3、找到导师模仿练习 4、走出舒适圈,突破自我 5、强化前行的理由
1、找到具有定义明确的具体特定目标
目标必须是十分具体的,可以逐个解决,把目标进行分类并制定一个可实施的计划。
目标是什么?
通过算法面试不是目标,而是一个结果,我们的目标是怎么样合理的刷完算法面试需要的那些题目,推荐的做法是按照标签来刷,难度上循序渐进,即把多种同类型的题先放在一起来做,比如一个时间段,只刷链表题,待刷得差不多的时候,接下来再刷二叉树的题。
由于不断的刷同个类型的题目,相当于在不断的重复练习,可以不断地加深自己对某个数据结构的理解,刷到后面可能发现这类题目都是有固定的套路,甚至一部分代码都是一模一样的。
这种刷法不仅在大方向上找到具有定义明确的具体特定目标,即合理的刷完算法面试需要的那些题目,与此同时,当刷同类型的题目出现困惑时,也能有目的性的去搜索相关的特定资料。
2、具有专注练习的状态
不建议在一开始刷题就去搜索一些模板来背,然后在解题的时候套模板,这样的刷题只是重复而不是练习,收获的只是经历而不是经验,背的再熟练,平时写的多块,没有自己的一个完整思考过程,在面试时很容易卡壳。
在刷题的过程中,争取做到三件事:
1、当写出 AC 的代码时,思考为什么自己可以做到
2、当写出 AC 的代码时,思考能不能优化一些
3、是否用到了题目给出的所有条件
很多题目都是由相似的题目改编而来的,增删一些条件题目的难度就会发生巨大的提升,基于这三个思考,每道题目都去多想一步,一步一步再一步,不同维度不同姿势都尝试一下,不要满足于一种解法,各种解法都写一写,争取做到 beat 100%,把每个题目都做干净,彻底攻克一道题。
3、找到导师模仿练习
搜索任何一道算法题,在网上都能发现不少文章,不过很多文章都是只提供解题代码或者加上一些简单的文字说明,为什么要这么写以及是怎么样想到这些方法的很少有文章会涉及到,这些人是高手,却不是导师。
高手和导师最大的区别在于,很多高手未必可以总结出自己的方法论,他们真的很牛逼但核心内容却只可意会不可言传,而导师一定有一套可以复制的方法论,他或许不一定是最牛逼的,但却是最适合模仿学习的。
目前 LeetCode 的题解区有不少大神写了不少细致的题解,找几个你看的顺眼的,模仿他们的思路去思考问题。
然后悄咪咪的吹一下自己,我利用动画的形式讲解算法,写了几百篇文章了,期间有不少人也在模仿我的风格去写作,取得了不错的效果,我最近把精力花在自己的个人网站 AlgoMooc 上,立志于更加细致的讲解 LeetCode,如果你找不到合适的导师,不妨访问 https://www. algomooc.com 来看看我的文章,我争取每道题目都录制视频,用五分钟讲清楚。
4、走出舒适圈,突破自我
当我们跌跌撞撞的刷了一些题目时,实际上,刷题已经变成了我们的舒适圈,在这个圈子中,你已经可以熟练的掌握了一些知识,如果我们想让练习取得成绩,我们得逼着自己走出舒适圈,最好的方法是自己去写题解,写一篇新手也能看懂的题解。
也就是熟知的 费曼学习法 。
什么是 费曼学习法 呢?
简单来说就是以教促学,每当你认为学会或者掌握一个知识后,去给别人讲明白,通过这种方式对自己做一个检验,突破自我。
李笑来曾经分享过一个观点,他说教育主要分为 3 个环节——
- 1、 教:我们最常做的读书、学习、听课等
- 2、 练:就是练习,大量练习,重复练习
- 3、 教练:在练习过程中遇到问题,教练帮忙指出来,然后继续练。
1、2 不断循环,直到把知识、技能练熟,能用到实践中,帮自己做成一些事情,创造价值。
以此作为参考 ,刷题也是可以分为 3 个环节---
- 1、学:阅读别人的提交
- 2、练:就是练习,模仿别人的思路来练习
- 3、教:就是教练,通过写题解的形式给别人讲明白一道题目
1、2 两点属于被动学习,吸收效率在 10% 至 30% 之间,而 3 属于主动学习,也就是费曼学习,吸收效率高达 90% 。
也就是说,我们在刷题的过程中,为了提高学习效率,可以主动的去写技术博客分享,注意是写技术博客而非技术笔记,笔记是给自己看的,博客是给别人看的,在这个过程中,表面上你是在教会别人,事实上你通过教会别人的方式来逼自己查缺补漏,你可能以为你懂了,结果发现无法表达出来,事实上还是没有理解透彻;你以为你讲明白了,别人一问,发现还是有遗漏点。
5、强化前行的理由
当初你觉得进行刷题提升自己的时候,什么是你的动力?
这个问题最好在一开始的时候就想清楚,并记录下来。
在《思维的囚徒》一书中,提及到一个原则,叫:自由地选择你的态度 —— 人无论在什么情况下,都可以自由选择自己的态度。事实上,任何一件事情,我们都能找到它的意义,它能帮助自己变得更好的角度。
刷题这个过程必然是有难度的,会给自己很大的压力,所以一开始先把你认为刷题后能带来的积极结果写下来,越多越好,不管现实与否,每当你想要放弃的时候,多想想这些积极的结果,想想熬过这个痛苦的过程能提升多大的改变。
术
道 是从宏观角度来思考刷题,那么 术 则是在微观的角度来看待每一道题目。
在具体做题的时候,可以采用以下三个步骤来进行。
- 1、看懂题目
- 2、分析解法
- 3、代码实现
1、看懂题目
首先就是明确题目要我们解决的是什么问题?提供了哪些参考示例?是否提供了需要使用的数据结构和算法?时间复杂度或者空间复杂度有没有要求?提示的范围有没有比较特别的数?边界情况是否需要特殊处理?
怎么样去看懂题目呢?
给你个公式步骤进行参考,即 四步分析法 !
- 模拟:模拟题目的运行。
- 规律:尝试总结出题目的一般规律和特点。
- 匹配:找到符合这些特点的数据结构与算法。
- 边界:考虑特殊情况。
结合一道具体的算法题来说明整个过程,算法题来源于剑指 offer 上的例题:矩阵中的路径。
1、模拟
首先看一下矩阵的 初始状态 。
我们需要在这个矩阵中寻找目标字符串 bfce ,第一步要做的就是先匹配上目标字符串的第一个元素 b ,我们从矩阵的第一行第一列的元素开始匹配,找到了 a 。
目标字符串为 bfce ,此时查找第一个元素为 a ,与目标字符串的第一个元素 b 不相同,需要在四个方向搜索,看看能不能找到符合要求的元素,我们按照 上左下右 的顺序进行遍历寻找。
- 上:越界了
- 左:越界了
- 下:是 s ,与目标元素 b 不相同
- 右:是 b,符合要求,依葫芦画瓢找第二个元素
- 上:越界了
- 左:是 a,与目标元素 f 不相同
- 下:是 f,与目标元素 f 相同,符合要求,依葫芦画瓢找第三个元素
- 上:根据题目要求不需要考虑
- 左:是 s,与目标元素 c 不相同
- 下:是 d,与目标元素 c 不相同
- 右:是 c,与目标元素 c 相同,符合要求,依葫芦画瓢找第四个元素
- 上:是 c,与目标元素 e 不相同
- 左:根据题目要求不需要考虑
- 下:是 e,与目标元素 e 相同,符合要求,寻找结束,匹配成功,返回 true
2、规律
- 1、在搜索过程中,如果当前元素与目标元素 不匹配 ,则回退到之前的节点再搜索
- 2、在搜索过程中,如果当前元素与目标元素 相匹配 ,则按照 上左下右 的方向进行再次搜索匹配剩下的元素
- 3、在搜索过程中,搜索 当前元素 的 上左下右 方向的元素时,会出现 重复访问之前元素 的情况,比如搜索匹配成功的第三个元素 c 的四个方向时,会重复访问一下 f 。
为了保证不重复访问节点,可以将这条路径上 已经访问过的节点 ,修改为不在 word 当中的一个字符,保证以后再次访问时不会重复访问,这里我们将其修改为特殊字符 # 。
修改完后会出现一种情况,当前的节点元素与目标元素相匹配,但是在它的四个方向的节点中都找不到可以匹配到目标下一元素的节点。
比如此时当前元素 c 与目标元素 c 相匹配,但是目标下一元素为 x ,而在当前元素的四个方向上都找不到 x ,需要把这个点回退,根据之前的操作,当前的节点被修改为了 # ,所以为了能够回退成功,再回退操作时需要重新将 # 修改回原来的元素。
3、匹配
本题提供了一个矩阵,矩阵是一个二维数组,需要我们在二维数组中进行搜索,为了能够覆盖所有的情况,必然要使用 两个嵌套的循环 。
在搜索过程中,当遇到匹配成功的元素,搜索其下一元素的操作与当前的操作一致,即可以使用 递归 。
- 递归参数 : 当前元素在矩阵 board 中的行列索引 i 和 j ,当前目标字符在word 中的索引 k 。
- 终止条件 :
- 返回 false : (1) 行或列索引越界 (2) 当前矩阵元素与目标字符不同 (3) 当前矩阵元素已访问过
- 返回 true : k = len(word) - 1 ,即字符串 word 已全部匹配。
- 递推工作 :
- 标记当前矩阵元素: 将 board[ i ] [ j ] 修改为特殊字符 # ,代表此元素已访问过,防止之后搜索时重复访问。
- 搜索下一节点: 朝当前元素的 上、左、下、右 四个方向开启下层递归。
- 回退时还原当前矩阵元素: 将 board[ i ] [ j ] 元素还原至初始值,即 word[k] 。
- 返回值: 返回布尔量 res ,代表是否搜索到目标字符串。
4、边界
- 1、行越界
- 2、列越界
- 3、矩阵元素已访问过
2、分析解法
在看懂题目的前提下,分析解法就轻松多了, 在脑海中我们已经大概知道了题目想要考察的方向,接下来我们需要思考的是题目的逻辑是怎么样的,不需要考虑代码层面。
需要注意的是,在第一遍或者第二遍解题时,不要过分追求所谓奇淫技巧的解法,很多同学错误的认为了奇淫技巧等于水平高超,我之前也出现过这个误解,很多 LeetCode 上的数学题都能一行或两行代码就 AC,每次自己写大半天发现答案竟然如此简单很是受挫。
后来发现,这些奇淫技巧并不能提高自己的水平,除了发在评论区能引来别人一句卧槽的惊讶,从而带来一点内心虚荣心的满足以外,其余的用处不大。
当然,等你刷个两三百到题目再回过头来重新思考,你会发现那些奇淫技巧的方法是如此的美妙。
3、代码实现
看懂了题目,有了思路,其实这道题的 90% 你已经解决了,把它实现出来按理来说就是自然而然的事儿了。
有时,将一个思路转换成算法是很容易且自然的;但有时,有些思路转换成代码,是很有难度的事情,这就是你写代码的能力问题,其实就是练少了。
刷题说到底还是需要 题海战术 。
总结
希望今天的这五千字的经验分享能带给你一些思考:)
2022年04月10日补充:
为了避免知乎大佬觉得我吹逼,先贴一下自己的 GitHub 地址, 目前 70,000 star,全球排名 51 名。
https:// github.com/MisterBooo
算法是一种技能,是可以通过科学合理的方式训练出来的能力。
在想刷题之前,得从心里认识到接受刷题很重要,才能坚持去刷题。
江湖有个传言: 国内刷 LeetCode,最多够你吃 1 年老本;湾区刷 LeetCode ,够你吃 10 年老本了。
为什么湾区的刷题性价比这么高呢?
你想想,电面考 4 道题,一道题值 5 万!单位是 Dollar !
刷到就是赚到!!
想想是不是很刺激,有没有动力开始刷题了!可以提速刷题了!
就目前互联网的情况来说,无论是面国外大厂还是面国内大厂,如果想换工作都要去刷题,一面二面不丢你几道 Hard 题,都对不住你偷偷摸摸找个会议室假装开会实则面试的鸡贼。
同时,还得认识到一点, 面试能力和你平时的工作能力其实差别挺大的。
有些人技术挺厉害的,但没有刷题,一面二面都过不了, 而某些小镇刷题家,还真就靠刷题拿下了 Google、微软、脸书等大厂offer。
国内大厂也有这种趋势,比如字节,一大半都是面试题。
要不是他提前先看视频刷题,妥妥得凉凉。
所以,刷题很重要。
(PS:感谢大家耐心的阅读,算法是程序员的重中之重,必须攻克,大厂面试必考,顺便送一份阿里大佬刷Leetcode总结的算法笔记,如果你能吃透,那我相信80%的技术面试都会不在话下:
BAT大佬写的Leetcode刷题笔记,看完秒杀80%的算法题!
这本书的目录,非常经典:
刷题大概可以分为 4 个阶段。
1、纯小白, 不知道怎么刷题,对很多概念都很陌生,各种数据结构和知识点几乎完全不懂,打开 LeetCode 第一题,满头问号。
有人相爱、有人夜里开车看海、有人 LeetCode 第一题都做不出来。
2、算法上基本已经入门,Easy 可以做出来,Medium 纠结半天也能有头绪,但基础不牢,比如字符转字符串还得 Google 一下。
3、刷了几百道题后,总结了自己的解题模板,参加周赛有时候甚至可以全部完成。
4、开始以 beat 100% 作为 AC 的目标了。
就目前的算法面试大环境来说,能达到第二阶段,中小公司可以应付过去了,到达第三阶段,字节、腾讯算法面试环节妥妥没问题了。
怎么样到达第三阶段?
给一下我的一些小建议吧。
1、如果目标是国内大厂,那么一定要刷足够的题,不需要把 LeetCode 上 2500 道算法题都刷完,但至少刷 200 道算法高频题,这些高频题我都写了题解同时也录制了视频,
在这个链接总结了: https://www. algomooc.com/1659.html
2、面试前一周以看题为主,因为刷题也刷不了几题,多看看自己总结或者别人总结的模板,比如回溯算法模板,掌握后,几十道回溯题都不在话下。
一些模板:
3、刷题过程需要注意难度要循序渐进,算法训练是一个系统工程,需要循序渐进,太过于急功近利,反而容易因做不出难题而产生挫败感,带来反效果。
如果你本身有基础,熟练度高,那你刷简单的 LeetCode 应该是几分钟一题,几分钟一题的,花不了你多少时间。
如果你刷简单都花费很长时间,说明熟练度不够,就更应该从简单开始,然后过度到中等,再过度到困难。
并且,目前国内大厂的算法考察,基本不会超过 LeetCode 中等难度,上限难度基本都是 LeetCode 中等题里面的中等难度,所以不要太去纠结难题怪题偏题。
把高频题掌握就行了: https://www. algomooc.com/1659.html
再退一步,如果你觉得 LeetCode 的题目太难,可以先从《剑指 Offer》上的算法题开始学起。
为了帮助大家更好的入门学习算法,经过半年的积累,我给大家 卷 了《剑指 Offer》系列的三十道题目,结合动画的形式录制了视频,相信能帮助你更好的刷题。
领取地址:
4、 按算法分类来选题,比如 一个时间段,只刷链表题,刷得差不多的时候,接下来再刷二叉树的题。
这样做有几个很明显的好处。
一、持续地刷同个类型的题目,可以不断地巩固和加深理解,可以总结出自己的思考路径或者解题模板。
比如链表题目,就会去思考虚拟头节点、双指针、快慢指针。
二、可以更全面地接触这个数据结构,算法的各个变种,这会促使你对这个数据结构,算法的理解更加全面和深刻,学习的效率会更高。
我一直认为读书是世界上性价比最高的成长方式,书很便宜但分量很重,是让我们摆脱平庸走向卓越的方式之一。
对于计算机专业的学生而言,读计算机经典书籍不光能让你快速提升知识和能力,更会让你在校招之际如虎添翼。
书籍下载: 计算机必看经典书籍(含下载方式)
最后,再给大家送上点干货!
下面这是一个 高赞回答合集 ,建议大家 点赞&收藏 ,Mark住别丢了, 大学期间绝对用得上 。
1、怎么学好数据结构,看下面这个回答,已经获得了 21000+ 的赞和 50000+的收藏。
2、如何系统地学习算法,看下面这个回答,已经获得了 11000+ 的赞和 26000+的收藏。
3、新手该如何使用 GitHub,看下面这个回答,如果在大学期间就知道使用 GitHub ,那么能力远超同龄人。
4、想成为一名优秀的程序员,那么这些程序员平时都喜欢逛的论坛怎么说你也得收藏一些吧。
5、无论别人怎么说,我都是坚定不移的选择计算机专业。
6、如何系统地学习 C++ ,这个回答能帮你找到路线。
7、想要准备 Java 面试,那么这些面试题必须掌握。
赶紧点赞和收藏吧~
分享一下身边大神的刷题顺序:
如果你时间比较紧迫,为了找工作而刷题,我建议你先刷热门推荐,一共两百多道题。
在 https:// leetcode-cn.com/problem set/all/ 页面的右侧。先刷热题 HOT 100,再刷精选 TOP 面试题,之后刷其他的题。
如果你时间比较充裕,那我建议你:
- 按从低到高的难度分组刷
- 按 tag 分类刷
- 定期复习,重做之前刷过的题
掌握 LeetCode 刷题方法再开始刷题,属于磨刀不误砍柴工。掌握正确方法是非常重要的。
如果你在刷题的时候发现怎么也写不出来,别担心,这是正常的。
如果你还发现,之前明明刷过的题,过段时间再做的时候,自己还是不会。别担心,这也是正常的。
刷题方法:
- 第一遍:可以先思考,之后看参考答案刷,结合其他人的题解刷。思考、总结并掌握本题的类型,思考方式,最优题解。
- 第二遍:先思考,回忆最优解法,并与之前自己写过的解答作比对,总结问题和方法。
- 第三遍:提升刷题速度,拿出一个题,就能够知道其考察重点,解题方法,在短时间内写出解答。
定期总结:
- 按照题目类型进行总结:针对一类问题,总结有哪些解题方法,哪种方法是最优的,为什么。
- 总结重点:有些题你刷了好多遍都还是不会,那就要重点关注,多思考解决方法,不断练习强
结合图解刷题:
有些人认为刷题比较枯燥,比较抽象。那你可以结合动画图解刷题。
在此以简单的排序算法为例:
单单排序算法就可以分为以下十种:
推荐一个用动画的形式演示 LeetCode 上的题目的项目:
例如基础的 冒泡排序法 演示如下:
选择排序法:
插入排序法:
希尔排序法:
归并排序法:
快速排序法:
堆排序:
计数排序:
桶排序:
基数排序:
该项目正在完善中,已经用动画的形式演示出了一下题目:
因为知乎排版没有表格,所以我就截图了,以上内容详见:
此外,再推荐一些免费的学习资源:
在学习的时候,要想为什么要这样设计,优点在哪里,有什么改进方法,逐步通过这样的方式提升逻辑思维能力。不懂就查,找学习资料和相关解答,坚持学习。
1. 算法学习 LintCode: https://www. lintcode.com/
算法学习网站,上去每天刷两道算法题,走遍天下都不怕。
2. 算法学习 LeetCode: https:// leetcode.com/
也是算法题网站,同上。
3. 算法学习 LeetCode 中文站: https:// leetcode-cn.com/
这个是上面算法题网站的中文站点,英文不好的可以刷这个,英文好的推荐去刷英文网站的题目,还能提升英语能力。
4. 中国大学MOOC网: https://www. icourse163.org/
中国大学MOOC是由网易与高教社携手推出的在线教育平台,承接教育部国家精品开放课程任务,向大众提供中国知名高校的MOOC课程。在这里,每一个有意愿提升自己的人都可以免费获得更优质的高等教育。
我是 程序员客栈,领先的程序员自由工作平台 。