下一篇我们就开始梳理面试算法的体系了,今天呢,有个问题有必要谈一下——如何正确对待算法,如何征服算法。
目录
1.如何平常心对待算法
2.关于准备算法面试的一些误区
1.如何平常心对待算法
在老师之前算法班的群里,有位同学分享过一个让人震惊的信息。他说一个女孩去面试,在简历的个人优势部分里写自己不孕不育,不需要产假。这个是优势吗?我问几个女同事,她们竟然对此表示认同,至少不反对。很多女生面试时也会被反复问及家庭和婚育方面的问题,甚至因此过不了面试,可见职场多么残酷!可问题是,不孕不育是亮点吗?我们是求职,但不是牲畜,也不是机器。每个人都有追求幸福的权利,为了家人、为了孩子, 我们更有动力去工作。这个女孩内心一定会有深深的失落,但这种失落不会化为认真工作的动力,只可能变成熬时间的浑浑噩噩。
认真只能将事情做对,用心才能将事情做好。如果我是她老板,会鼓励她该看病就请假看病,回来就认真工作,只关注考勤和工作时长的公司不是好公司,特别是重在脑力劳动的互联网公司。
这件事也告诉我们想打造一个亮点是多么难,在简历上加一条要付出多大的代价。那问题说回来,什么才算亮点呢?我们知道社招面试会考察三个显式方面:项目、技术和算法。还有两个隐式方面:学历和上一家公司的档次。 显式的意思就是面试可以聊,而且能直接反应你客观水平的。隐式条件是双方不会怎么说,但是大家心照不宣,而且你也无法改变的。所以,项目经验丰富是亮点,技术水平过硬是亮点,算法能力强是亮点、学历高学校好是亮点,上家公司好也是亮点。面试就是战场,将所有的亮点摆出来,就看谁能到最后。
能否面试成功、能要到多少的薪资 ,很多时候是看你值多少钱,而不是多么能加班。经常在各种群里看到抱怨如何如何被歧视,参加线上交流的时候几乎每次都有人问两个隐条件,平时也经常有人反复问:想去大厂,专科有机会吗?外包有机会吗?小公司有机会吗?等等。事实上,告诉你有和没有有啥区别吗?你能做什么吗?什么都做不了!可以告诉你100个没有机会的理由,也可以告诉你100个有机会的例子,我至少有五位同事都是普通学历,但是进了微博美团等大厂。你会花几年重新高考吗?你能让时光倒流,重新冲击大厂吗?如果不会,纠结这个问题有什么意义呢?
学历歧视是普遍存在的,只是没有哪个公司敢直接说而已,各行各业都这样,大家都心知肚明。爱美之心人皆有之,如果选择贾玲和杨幂做你老婆,你会选择谁?我们都知道贾玲非常优秀,非常幽默,人品又好,还很会挣钱,所以我选择杨幂,原因就一个:杨幂漂亮!如果两个求职者面试情况非常接近,一个是阿里来的,一个是某个谁都不知道的小公司来的,你更想要谁?这是人的本性,我们无法改变。如果换位,我们也可能是那个我们讨厌的人。
相对而言,研发岗位更注重真才实学,即使你学历高学校好也不见得就一定能行,如果技术不清不楚,算法也写的不好,那学历就是个摆设,机会还是没有,这种例子也非常多。另一方面,很多公司在缺人的时候会降低隐性要求,给你一个面试的机会。那接下来就看你面试的表现了,项目水平、技术深度和算法能力就真刀真枪来一遍。遗憾的是很多人在面试过程中软绵绵的,技术说不清楚,算法写不出来,甚至直接放弃,那对方怎么给你机会呢?
都知道算法很难,但是要去大厂、要拿高薪,这是必须要过的坎。
遗憾的是很多人 ,发完誓之后就不见了。
不少人快面试的时候才想起来算法弱,然后急着问怎么办。别人能怎么办?要是3天就有办法解决,那老师的课就不是几百了,而是几万,我相信愿意来的人更多。
之前互联网行业行业整体是缺人的状态,机会很多的,但是近几年情况发生了很多变化,互联网虽然不到“前端已死,后端已凉”,但是需求大幅下降。供过于求的情况下,内卷是必然,技术卷,算法也会卷,所以算法已经不是“锦上添花”的内容,而是每个程序员必须要过关的坎。
“穷则独善其身,达则兼济天下”,我们要么躺平,要么把自己锻炼成金子。我相信加入鱼群的你还是想锻炼自己的。如何面试、如何学技术,包括我们接下来要谈的算法等都是有科学的方法可以训练的,只要将相关的能力训练出来就行了。
所以如果以后再有人问起点一般有没有机会去大厂,我们就直接问他“算法如何”,如果说不会,那就直接告诉他没有机会。反之,则鼓励他,积极关注,有机会就去冲刺!
平时感觉自己还挺聪明的,一到算法就感觉智商为0, 该咋办呢?
我可以明确告诉你,面试官也是刷题过来的,大部分面试都是以常见题目为主,而常见的算法题是有限的,常考的题目类型也是固定的,因此你只要将我当成驾照一样,集中一段时间将其学会就行了。
学会这些不是要百分百过一切面试,而是做到80%以上的题目都能搞定就行了。我们的课程也绝不会说让你一定能解决所有的算法,那你需要海量的时间和精力,我们的目标就是让你用最少的时间搞清楚80%的问题,剩下的时间学技术、做项目更有意义。那如果遇到奇葩面试怎么办呢?不用怕,大不了问候一下他祖宗,换下一个公司就是了。
所以, 算法这东西就当做驾照,常见不过十几种专题,300多道常见问题,将当做要掌握的一种必备技能就行了。反之,一直回避,不想下功夫,却天天抱怨,每次换工作都要被折腾一圈,即使大厂招人,很多人也压根就没机会。
面试的算法其实没什么用的,尤其是不会在工作里用
很多人想学算法,觉得对工作非常有用,所以要学好,所以要好好刷LeetCode。我可以告诉你LeetCode里的算法是没啥用的。你在工作中有写过链表吗?有写过二叉树吗?有自己实现过回溯吗,有写过动态规划吗?反正我从来没有。因为这种代码不易扩展 ,很难维护,如果在工作中写,一定会被骂,但是在算法里是绝对的重点。
那算法有什么用呢?其实就是练习思维的游戏,说白了就是面试用的。那话又说回来,为什么面试非要现场写算法呢?因为算法是测试你是不是金子的最有效手段。这种方式不是完美的,但是最好的。
我也曾经很排斥,但是当我作为面试官去面别人的时候才感觉到为什么非要这样。从一开始我就努力识别这个人的水平到底怎么样,我会分析项目里哪些是他自己做的,哪些是他真正理解的,哪些是他背的。 但只有让对方写个难度中等的算法,看他在整个过程中的表现,我才会放心他的基本功是不是扎实的。
为什么呢?因为算法是所有程序员的共同语言。虽然都是做java,大家的行业和具体的事情千差万别,很难准确判断一个人到底水平如何,说不定他说得天花乱坠的设计,最后只是写了个if else。做CPU指令的人也不太可能懂前端小姐姐说的vue是什么。做网络的面试官可能对擅长数据库的求职者也没什么感觉。数据结构与算法就成了双方都能交流的领域,而且好坏立竿见影,不管怎么说,能写出来,能运行出来就是真功夫。对于大厂以及很多还不错的公司,算法成了面试的一个必备环节,有的面试官只有亲自考你一个才放心。
2.关于准备算法面试的一些误区
对于算法,有很多很多的论调,有的还截然相反,这里看几个。我们都不喜欢说教,但是在之前的课程中,和很多小伙伴聊的时候都发现存在一个或几个问题,这会影响学习效果,干脆就统一列举一下吧。观点没有好坏,希望能帮你进一步审视算法。
1.学而不思,思而不学
经常有人说花了3小时写了一个算法,这样不好说不好,只能说效率太低,偶尔干一干还是可以的。很多算法的方法是固定的,完全靠自己想出来费时费力,即使写出来的,不管结构还是设计上可能非常差,而且很容易就忘了,面试时即使考原题还是一样懵逼。比如在《位图》一章,我们会介绍很多技巧,这些靠自己面试时临时想出来几乎不可能。这就是典型的思而不学,还有人是另一个极端。有的人说自己刷了200题,还是感觉很迷茫,我非常怀疑他根本没有刷清楚,可能只是跑了一下别人的答案而已。如果刷过一定量的题,一定会发现大量的考察点是重复的,很多问题本质上是一个东西,所以题目是越刷越少的,甚至还能自己出题,怎么会越来越迷茫呢?那学和思怎么划分呢?我的感觉做题以半小时为界限,如果半小时后还想不到怎么做,就该找别人的解析来学习。
2.抬头仰望星空长叹,低头抱怨不断
很多人愁算法的时间比真正练习的时间更长。不知道大家在学生时代是否一直为如何学好英语犯愁,整天各种疯狂英语,各种新东方,但是一直到毕业也没将英语真正学好。为什么?一个原因就是天天喊着要学习英语,但从来没做过,更别说坚持。算法也一样。还有的人马上要面试了,才急着找个佛脚抱抱,平时根本不关心。有的人会一时兴起,随便选一道题来考察自己算法到底行不行,十有八九是失败的,因为一道题可能涉及了hash,涉及了树,涉及了递归,结果你连怎么定义树节点都不知道 ,怎么可能解决呢,最后必然是打击自己。这就好比很久没运动了,突然让跑一万米,谁能跑下来?
3.总想着一步登天,一劳永逸
有的人想着从0开始,于是就找了本厚厚的数据结构书看。但是大部分人会对这类书没什么感觉,更不会坚持看完,于是没多久就不了了之。有的人发誓将leetcode全部刷完,彻底解决算法问题,然后从第一题开始向后刷,要知道LeetCode里靠前的题目普遍比较难的,因此费劲好大也没刷几道,信心没有了,不想刷了,甚至心生畏惧,最终算法成了过不去的痛。有的人希望算法能达到熟记的程度, 抬手就能来,这是不可能的,我们重点在于理解清楚,面试的时候给你点时间就能想明白、写出来,而不是全部熟记才算。
还有的人总是感觉动态规划才叫算法,回溯才叫学算法,而不重视基础问题。其实是认为高难度题目都会了,基本问题还是事吗?
这就像总想着取到白富美, 对自己身边的女孩漠不关心,那注定孤独一生。面试过程中大部分算法是以基础问题和变型问题为主的,有点难度,但是不会难于登天。如果只盯着难题,往往会难题搞不清楚,基本问题又不会,也许这就叫走火入魔吧。
4.因为别人的外在吹牛而焦虑
例如喜欢看一些如何刷算法的毒文章,有些会推荐一堆的书,特别是《算法导论》。我觉得这种人真该死,因为这本书虽然叫导论,但比一般的算法书要难很多,没有足够的数学功底根本看不了。起点不高的人看了会迅速失去信心,因此这类书对大不部分人来说根本不适合,这种毒文无疑也让人坚信算法天生是难的,更别说乐趣。没有乐趣的学习,注定无法持久的。还有人对群里那些炫耀特别敏感,有些面过大厂的人为了提高自己的逼格,会极度渲染面试的紧张,比如30min必须写完,要当着面试官的面写完,远程时面试官盯着你的桌面让你写等等。
事实上,在面试官面前写算法,如果你一直没有思路,有些面试官会提醒你的。如果你的思路有问题,他也会提醒的,方案没有问题才会让你去写,这无疑会降低你写算法难度的。所以面试官盯着你,你就当成一个高手在指导你就行了,何必这么紧张。那些人渲染面试多么紧张会给别人带来极大的恐慌和焦虑,所以这种人我是看到一次怼一次,绝不客气!
5.总感觉以后在工作中多积累一些算法就行了
事实上面试算法和工程算法的侧重点是完全不一样的,相互之间的关联非常少。我们在后续章节中会看到大量这样的例子,例如工程中会大量使用Hash,因为简单好用又稳定,但是很多算法一旦使用Hash就没有含金量了。所以在面试算法里,Hash只是个备胎,只要有其他思路一般就不用了。在工程应用中我们追求的是易用性和稳定性这些,而算法更多考察思维能力而不怎么管是否能用。所以必须针对面试算法做一定的积累,指望工作中积累只会是幻想。
6.工作事多、平时很忙,没时间学习
别说没时间,因为这只是借口,对自己不够狠。这个我们前面介绍过狠人是怎么干的,今天再说一个例子,我读研时,实验室里曾经有位博士,有机会去斯坦福大学。当时他只有3个月的时间来准备英语,还有科研任务在手,而当时他连英语6级都没过,怎么可能在3个月内达到要求呢?于是他报了新东方的培训班,坚持上课学习,然后每天早上5点起来练英语,就这样一直坚持,直到考完。后来回国后,一个公司给开年薪150W,结果人家没看上。
你觉得让他脚本会更快吗?让他做需求会更好吗?加班时间会更长吗?那凭啥人家的薪资是我们的几倍甚至十几倍?因为他档次高!关键时刻他能顶住压力做到常人做不到的事。薪资水平不仅仅取决于工作时长,更多是自己的档次和展现出来的能力,让人相信你值这个价。一直强调自己能加班,反而显得自己技术水平不够。虽然大部分都不会在工作中用,但是算法本身就是思维能力的一种证明。不会做就不给加钱,做出来就敢多要几千,就这么简单。
7.试图能通过硬背答案来解决算法之痛
算法有没有模板?有的,而且还很多,越是高级的算法越有模板,例如二分查找、各种牌组方法、数字、位运算、双指针、滑动窗口、回溯、动态规划等等都有自己的模板,而前缀树、线段树、堆、平衡树等等本身就是一套规则,理解规则了,题目几乎都不用做。
既然有模板那是否可以背一下呢?那就错了,模板是思想一致,解题思路一致,而具体的代码则千变万化,不可能记住的。而且稍微换一下条件就可能修改好多代码,因此靠背答案是没有任何意义的。比较靠谱的是先透彻理解算法的思想,一题一题做,将技能和技巧总结出来,最后将题目归类总结出本类型题目的解题套路,这就是模板,我们后面几乎每个章节都是这种方式进行的。
8.能不能考个证,然后面试就不用面啦?
我曾经试图找各种算法的误区,一次上课直播的时候,一位同学的问题让我瞬间懵逼“有没有算法的证啊”。我就问他为啥要考证,他说这样可以证明自己算法确实过关了,然后面试的时候就可以不用写了。