您的位置首页生活百科

刷完 LeetCode 是什么水平?能拿到什么水平的 offer?

刷完 LeetCode 是什么水平?能拿到什么水平的 offer?

的有关信息介绍如下:

刷完 LeetCode 是什么水平?能拿到什么水平的 offer?

额,目前认识的大部分喜欢刷题的人都刷了 500 道题目左右,也基本上可以应付字节跳动等大厂的算法面试环节了,至于说刷完全部,我觉得除非是特别喜欢刷题+时间充裕,我是觉得没必要这样做。

这里分享一篇 ACM 大佬刷题的经验给大家。全文 5000 字,建议先收藏或者双击标记,文末提供刷题 PDF 下载。

很多人开始他的刷题之路因为各种各样的原因:进大厂、研究生复试或者参加竞赛拿牌,当然也可能是因为喜欢。其实不管你抱着何种目的开始,我希望你能一直在刷题这条路上走下去,毕竟除了提高自己解决问题和写代码的能力这种显而易见的好处,也能当作无聊时候的一种消遣...

其实随着刷题的深入,我发现刷题其实就是分为两步:

接下来我所有的废话都是围绕这两步来展开。

先说第一步:有思路。

算法题刷多了,你就会发现,最后其实在你脑子里记住的不是实现这道题的代码,而是解这道题的思路。

当我们刷了几百道几千道算法题的时候,你不可能记住每道题的代码,但是你可能知道这道题的思路,也就是出现类似“这道题我见过,我知道用这样那样的方法可以做出来”。有了思路,其实把它实现出来就是自然而然的事儿了,当然可能有人说知道了思路也不知道怎么实现,现在我先不说,这是我们下一步要讲的问题。

上面说的是我们要走到的目的地,那如何走上这条路,从而到刷题刷到思路“泉涌”呢?其实很简单,我们从小到大一直在被动习惯的四个字:题海战术。

题海战术,说白了就是多刷题,见多才能识广。

但这里的多刷题,不是指多瞎刷题,而是有方法的去刷。至于刷题的网站我已经在文章的开头放链接了,不知道去哪找题的可以看一下。

首先说什么是瞎刷题,就是看到一道刷一道,这是很多刚开始刷题的同学容易犯的毛病。

有的追求数量,刷了一堆简单题,沉迷在 AC 的快感中不能自拔,在深深的自我感动中依然菜的扣脚;

有的追求无脑,看到一道题就去网上搜答案,以为会解决问题,实则搜到了还看不懂,正好一劳永逸,给自己下了不是这块料的断言,成功的做到了开始即结束。

别问我为什么知道,我才不会告诉你当年我就是这样...

其实怎么用正确的题海战术,在我看来,其实也还是两步,第一步多题一解,第二步一题多解。

当然在此之前,我觉得你得先搞明白什么是时间复杂度和空间复杂度,不然不懂这些指标,你也不知道算法对于你当前题目的优劣。之前写过一篇旧文,有兴趣的可以看一下。

多题一解,就是把多种同类型的题先放在一起来 做,也就是俗称的刷专题。下面是我当年刷题的一部分分类的截图:

很多大佬说做题要追求完美,一道题来 N 种姿势,但是对于刚开始起步的同学来说,一道题带着多解的思想包袱去刷,本身就是一种负担。你很难指望初学者能一上来就一题多解,没那么多见识,脑阔里没储备那么多的算法类型,能够暴力破解且跑通就已经是烧高香了。

这里再多提一嘴,关于网上搜答案这件事,答案可以搜,但是不要上来一看题,感觉自己不会就立马搜答案,要尝试思考,多在草稿纸上写写画画,实在想不出来再去搜。

搜到的答案我不希望你去看别人的代码,按照别人的代码一步步的写出来其实本身没有多大意义,真正有意义的是别人的思路,通过别人的思路来自己实现出现,这才是最应该做的。

这样做的好处是,你可以很快了解一种类型题目的做题方法,加深对某类算法的理解,总结出做题的套路,这算是一种抽象的概括能力。很多时候你就会发现,题目不过是在某类解决办法方面做加法减法。

其实这个不用刻意去追求一题多解的能力,刷的专题多了,碰到的题目多了,自然而然你碰到一道题的时候脑袋里就会有想法,觉的可以这样做,也可以那样做,这个时候你就可以对比不同的时间复杂度和空间复杂度,选择当前的最优解法。

说一题多解,其实就是希望你在碰到一个问题的时候能够多想一步,一步一步再一步,不同维度不同姿势都尝试一下。刚开始这可能比较难,毕竟这涉及到一个改变,因为人都是有惰性的,毕竟只求一解比自找麻烦的求多解舒服多了...

题目见的多了你就会发现,很多时候你会碰到这种情况:A 题你有 5 种方法去解决它,改变它的某一个条件变成 B 题,作为 A 题的相似题 B,可能这个时候你照搬 A 的解法来解决 B,你只剩下 3 种或者更少的解法可以解决 B 题,如果你只会 1 种解法,刚好这种解法失效,那你就只能再另想它法。

所以一题多解的好处也是显而易见的,就相当于你的手里多了很多的选项,选项多了不管你在面试或是其它时候,都能手里有牌可打。

在这里我又要多提一嘴,追求一题多解并不意味着“不择手段”的追求题解数量的堆叠,也就是不要过分追求所谓奇淫技巧的解法,而这恰恰是许多同学容易犯的毛病,错误的认为了奇淫技巧等于水平高超,在我看来这个除了能引来别人一句卧槽的惊讶,从而带来一点内心虚荣心的满足以外,其余的用处不大,看个热闹就得了。

毕竟鲁迅先生曾经说过:“Use your best judgement”。

当然我也不是全盘否定技巧,但是你连个两三百道题都没刷完,你就在这给我讲你要技巧,我会认为你是在耍流氓...

一道题有了思路,其实这道题的 90% 你已经解决了,把它实现出来按理来说就是自然而然的事儿了。

当然可能有同学知道了思路,但是就卡在这 10% 不知道怎么实现上,那这就是你写代码的能力问题,其实一样的,这就是不熟练,不熟练的原因就是练少了。

其实这个问题的唯一解还是所谓的“题海战术”,多练习,唯手熟尔。

刚开始的时候不管是书上的例题,一些简单的水题或者你想实现的一个简单的东西,按照你的想法写出来或者看一遍别人怎么写的,自己再一步一步的默敲,不要怕麻烦,一定要自己动手,不要看会了,我们都知道看会了其实不是真正的会。但是慢慢当你习惯了这种方式,你的代码能力会潜移默化的变强。

别问我为什么知道,我难道要说作为一个当年上了大学半年还没写过一次超过 20 行的代码的男人,经过一个寒假以后,能切百十行代码的题?

也太丢面儿了吧,说好的整个学霸人设呢...

咦?不是只有两步嘛,哪来的第三步?

嘿嘿,总得给能坚持看我说废话看到这里的同学开个小小灶不是...

其实还有两点是我想说的,而且这两点是我觉得在整个过程中最重要的。

怎么说呢,做总结这件事的好处,谁做谁知道,不信你就试试...

每道题有每道题的总结,每种类型的题有某类题的总结,千万不要怕麻烦,虽然刚开始的时候确实会很麻烦...

每每回想起来,我最后悔的就是在我刚开始刷题的时候没有做总结。当年集训队老师告诉我们每道题做完都要把题解发布到 CSDN 上,记录自己的思路,解题方式和代码。这件事乍一听我觉得太麻烦,觉得“有这个时间我多刷道题它不香嘛”,一直当作耳旁风。

后来真正开始在 CSDN 上发题解,并不是我突然顿悟,而是集训队老师看我们太懒,强制执行,然而这个强制,在经过初期的不适以后,慢慢的让我形成了做什么都要总结记录的习惯,一下子就写了 6 年。

保持热情,不仅仅是能坚持,而要在坚持上最好能带有一点兴趣。刷题真的是一个很漫长的过程,如何在这个过程中能坚持下去真的很难做到...

我觉得你最好有一个最终的目标,这个很多开始刷题的同学肯定都有,不然没人闲着没事找事去刷题,有了最终的目标朝着这个方向去努力,同时把这个过程分成一部分一部分,比如拿刷专题来说,我这段时间刷链表,下段时间刷贪心,再下段时间刷 dp...

将目标量化为可衡量的每一段,自己有了掌控感,一步一步的向着最终的目标前进,知道自己离着还有多远,不至于半途而废。

拿我自己来说,当年搞 ACM,半年以后我已经准备放弃了,那段时间完全迷茫,觉得自己水平很差,没有机会去参加比赛,不可能拿到奖牌。那段时间我开始去寻找别的出路,去参加 Python 的社团,准备转去做项目。

浑浑噩噩了一圈,最后还是回去做 ACM,一方面是不想让自己半年的努力付诸东流,对拿牌子的执念,更多的是我发现坐在那写项目和做题比起来,我更喜欢 AC 的快感。

以上就是我的一点点经验,其实没有什么新鲜的,有点啰嗦,也不一定能让你有什么进步。我一直觉的只要我们付出了时间和努力,开始向更好的方向迈出第一步,我们解决问题和写代码的能力就会潜移默化的提高。

在这个过程中,收获的远比去解决问题更有成就感,当然这种感同身受更多的需要你自己在这个过程中去体验。

可能末了整篇文章最有价值的只有四个字 - 题海战术。

希望你在变好的路上越走越远...

为了避免知乎大佬觉得我吹逼,先贴一下自己的 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 面试,那么这些面试题必须掌握。

赶紧点赞和收藏吧~