刷LeetCode心态崩了...
大家好,我是帅地。
前两天在知乎里回答了一个问题:“刷LeetCode吃力正常吗?”引起了一些同学的共鸣,所以将回答修改了之后搬运过来,让更多人看到。
首先说结论,刷题的时候觉得很难,甚至是心态崩了都是正常的。
题主只是看了C++ primer就觉得心态崩,老梁当时拿了acm银牌好几次在面试的时候遇到LeetCode原题,因为没刷过靠着基础硬做都好几次翻车。虽然最终都做出来了,但是整个过程还是挺狼狈的。
老梁有好几年的竞赛功底尚且如此,所以对于大多数同学来说,刷LeetCode觉得困难都是正常的。这些题目就是想出来为难我们的,这样才有锻炼的效果。要是你刷LeetCode觉得特别轻松,连hard级别的问题也砍瓜切菜。那你一定要来联系我,可不能让icpc界少一个天才。
一件事情困难不要紧,但是它得有足够强的必要性,否则会很容易放弃。所以很多同学刷着刷着放弃了,并不只是觉得太难,往往同时也觉得好像没啥必要。
想要心态不崩,除了降低难度之外,提升对必要性的认知也很重要。高考也很难,但是大家也都熬过来了,考研也很难,每年考研的人数只增不减。所以困难并不可怕,可怕的是没有意义的困难。所以我们得先解决意义这个问题,为什么刷题是有意义的?为什么这样困难的事情值得我们去做?
很多同学不能理解,为什么现在的企业面试喜欢让人刷题。不仅笔试做题,面试也要做题,觉得太应试,太八股了。
实际上很好理解,古话说,是骡子是马拉出来溜溜,面试中做算法题就是拉出来溜溜的操作。毕竟程序员入职之后是要写代码的,你代码写得好不好非常关键。想想看,企业总不能光听你的夸夸其谈就给你高薪吧?怎么着也得试下你的水平,看看你写的代码。
但是面试时间有限,也不可能让你写一个服务,或者是写一个很复杂的功能,最简单的就是让你做道算法题。看看你面临难题时候,有没有一个成熟的思维模式,思维是否活跃。写出来的代码是不是美观漂亮,是不是一个经验充足的工程师写出来的代码,以此考察一下你的编码功底。
大家都知道谷歌面试很难,经常出一些很难的算法题。但是大家知道谷歌面试除了会看你的算法题有没有做出来之外,你的代码风格、编码速度、bug数量,这些都是会纳入考量的吗?其实也不只是谷歌,国内的公司也一样,老梁之前面阿里,面一些外企风格的公司,他们也都很看重代码的质量,而不仅仅是做出结果。
对于校招生而言,算法题这个模块在面试中可能会更加重要。毕竟校招生可以拿来说的东西不多,有不错项目经验或者论文的就已经是少数了,很多同学即使项目经验出色,有不错的论文,但也不一定和岗位对口。实际上大概率是不对口的,所以项目经验的意义实在是非常小,还是要考察硬实力、基本功。要考察基本功,自然就绕不开刷题。
如果你的项目经验本身没什么太多亮点的话,就更要好好刷题了。毕竟这是面试当中为数不多可以展示亮点的时候了。
当年老梁拿到阿里的实习offer,就是因为面试的时候题目做得好。因为老梁当时除了acm的银牌,实在没什么拿得出手的项目经验,就是靠着面试当中对于算法题的敏锐,征服了面试官,让他们相信招我进去我能很快成长达到公司的要求。
所以如果你对刷题觉得畏惧或者是反感的话,不妨换个角度想想,这可是一个很好展现自己能力的机会。在刷题这件事情上大家都是公平的,水平高低都是个人努力的结果,几乎没有什么外在因素影响。能有一个公平竞争的机会,不是很好吗?
说完了必要性,再来聊聊难度的问题。大多数困难的事情都讲究循序渐进,也很讲究学习方法,LeetCode也不例外。
很多人把LeetCode当成了打游戏刷奖杯,上来就按照顺序刷,或者是立个小目标要刷完前多少多少题。老梁个人不太鼓励这种做法,因为这样你面临的题目的考察范围以及难度都没有保证,题目的波动性很强。波动性一大,就很容易遇见超出能力范围的题目,然后导致心态血崩。
那正确的做法是什么呢?不要把刷多少LeetCode当成目标,而是把LeetCode当成你学习算法的工具。
比如说你学了二分法,然后去LeetCode上找一些二分法相关的问题,由易到难,一道一道解决,把二分算法吃透,然后再学下一个算法。这样做有两个好处,一个是难度可控,同一个算法从简单到困难,循序渐进。其次是会让你学到的算法变得非常扎实,那些国际赛场上争金夺银的大佬们平时都是用的这种方法。
当有了一定的算法积累之后,比如常规的算法、数据结构都学会了,玩法就随意了。可以参加参加周赛,也可以按照顺序刷。如果觉得不过瘾,还可以去找一些其他的OJ来练手。基本上到这个时候,一般面试里的算法题也构不成威胁了。
最后,简单升华一下,遇到难题心态血崩是容易的。但咱们也不能光血崩了,心态崩完了之后其实也办法可以想的。很多时候只要我们试着去想想办法,而不是把它弃之一边了事,结果往往就会大不一样。