腾讯、百度阿里等国内的一线名企,在招聘工程师的过程中,对算法和数据结构都会重点考察。但算法易学难精,让很多程序员都望而却步,面试时总败在算法这一关,拿不到好 Offer。
本次IT君采访到了 Google 资深软件工程师苏勇,一起花10分钟看下他是如何学好算法,冲击谷歌 Offer 的。
嘉宾介绍
苏勇
Google 资深软件工程师
现负责 Google Maps 产品研发工作,并参与多个开源软件的开发和维护。
作为力扣(LeetCode)骨灰级用户,苏老师曾贡献超过 200 套算法题目的解题方案,获得很多技术同行的赞同和分享,另外在知网发表过多篇算法相关论文。
作为 Google 面试官,苏老师在负责技术候选人的考察、设计面试考题与评分标准等重要环节,拥有大量技术人才选拔经验。
以下为专访内容整理
▼
IT 君:您是如何拿到 Google 的 Offer 的?能简单介绍下当时面试的场景吗?都考了哪些算法题?
苏老师:从面试完毕到拿到正式的书面 Offer 刚好是一周的时间,拿 Offer 的时间很快。但是为了准备 Google 的面试,我却做了充足的准备。
在我确定自己要去面试 Google 的时候,我正在 Box 带领团队开发一款全新的产品,所以我给自己预留了半年的时间做最后的冲刺。一方面,我得保证 Box 的产品进度,一方面,我也得保证自己有足够时间复习力扣(LeetCode)上的算法题。我将题目进行了分类,按照公司、题目热门程度、难度进行了排序,定下所要复习的题目数量,计算出每周必须要完成的题目,然后严格执行。皇天不负有心人,最后我如愿拿到了 Google 的 offer。
Google 面试注重交流以及能否迅速地将解题思路转换为代码的能力。每轮面试45分钟,我被问到算法题和系统设计题,虽然很多问题都不是力扣(LeetCode)上的原题,但是很多具有相似性。在每轮面试中,面试官问的第一题,基本都是热身,要求你在比较短的时间里写出代码,而后续提问一般都会花比较多时间去讨论。记得有一轮面试,我最后两分钟才找到思路,到最后一刻才按照面试官的要求把代码写了出来。
回想起来,能拿到 Google 的 offer 是幸运的也是幸福的,所以很希望能和大家分享经验。
▼
IT 君:算法在您的成长里程碑中有什么助力?
苏老师:算法让我脱胎换骨,不仅帮助我找到了梦寐以求的工作,更在日常的工作生活中起到了非常多的作用。比如跟谷歌的工程师们讨论问题,我们会就算法的时间和空间复杂度进行探讨,分析各种解决方案的利弊。另外,我一直保持书写简洁代码的习惯。在 Google ,代码的可读性是审核代码的重要环节,如果代码写得很难懂,是很难通过审核的。
掌握数据结构与算法,让我对面试不再感到恐惧,也能让我在分析问题的时候拥有更多的思路和方法。
IT 君:您认为,对数据结构和算法不重视,对日常工作有影响吗?
苏老师:肯定是有的。
首先,程序员这个群体也是有金字塔结构的。如果连基本的算法和数据结构都不会,基本上就比较底层,底层就意味着低薪酬。付出同样时长的脑力劳动,赚得就会比别人少。
其次,作为团队里的一员,很多时候不光要做好自己的本职工作,也要和其他团队进行技术问题上的沟通,如果没有扎实的算法和数据结构基础,很难及时发现问题并提出独到的见解。
另外,技术栈本身每天都在变化,同时也会随着不同行业不同公司改变。能否快速适应新技术和新环境就显得尤为重要。这就要求你必须具有以不变应万变的的计算机思维、算法思维和逻辑思维能力。
▼
IT 君:算法好的程序员可以有哪些发展方向?
苏勇老师:我觉得算法好,只能代表你对程序的理解比较好、能更深入的看到问题,并进行优化。这种特质是优秀的,但是要上升到职业发展的话,还应该在各个层面去磨练。
比如我经常看到身边优秀的程序员希望尝试做经理,那么他们得先从 Tech Lead 做起,学会如何领导一个项目、学会如何跟项目经理、设计师甚至是跨部门团队的成员进行有效沟通。
算法好的程序员有一个得天独厚的优点:一旦对问题进行技术上的分析时,他们总能洞悉到项目经理和设计师无法看到的那一面,会提出建设性的意见。
▼
IT 君:为什么面试官都喜欢问算法和数据结构呢?
苏勇老师:数据结构与算法能力的考核在以 BAT 为代表的国内大厂,乃至 Google 等硅谷高科技公司的面试里占了相当大的比重。总结起来,考察的原因有四:
算法能力能够准确辨别一个程序员的技术功底是否扎实;
算法能力是发掘程序员的学习能力与成长潜力的关键手段;
算法能力能够协助判断程序员在面对新问题时,分析并解决问题的能力;
算法能力是设计一个高性能系统、性能优化的必备基础。
我自己也非常看重候选人的解题思路,以及能将思路迅速地变成代码的能力,比如我喜欢问一些二叉树相关的题目,这些问题的解法体现了面试者对数据结构的熟练度,以及分析算法复杂度的能力。
▼
IT 君:您认为面试前刷算法题重要吗?如何刷题比较好?
苏勇老师:如果是去面软件工程师的职位,刷题我认为是必须的。在我看来刷题就像是高考前的冲刺,有2个好处:首先,可以起到巩固算法基础的作用;其次,可以帮助自己对某些算法进行总结和整理,达到融会贯通的效果。刷题的方法因人而异,因时而异。我自己分为这几个阶段:
1.准备面试初期阶段
我是按照力扣(LeetCode)的算法知识点进行分类训练,比如,我会先看二叉树相关的题目,因为它在前端面试中是非常热门的话题;之后,我会看图论,因为它是二叉树的扩展;再接下来,我会看递归和回溯,因为它们是算法面试里经常被问到的知识点。通过一段时间的专注练习,我可以整理出一套解决相关问题的模版,帮助我理解记忆。
2.准备面试的中期阶段
开始针对各个公司的热门题目进行复习。由于有了第一阶段的积累,我开始针对心仪公司,有目标性地刷题目。这个阶段有点类似于高考的模拟考,看看自己的水平能否达标。如果当我看完了题目,而且在10分钟之内没有任何头绪,我会看答案,然后吸取高手们的思路,最后思考能否优化。
3.最后的冲刺阶段
把精力放在平时做得不好的题目上。这个阶段主要是给自己树立信心,我会快速浏览之前做过的题目,整理思路,把一些经典的题目写在黑板上或者纸上。如果是太难且不是很热门的题目,我是不会花费太多精力的。
这里强烈推荐大家在纸上和黑板上练习写代码,这对书写清晰可读的代码是非常有帮助的,试想一下,如果面试官看不懂你写的代码,他们怎么跟你沟通呢?
▼
IT 君:有没有什么提高算法面试通过率的好方法?
苏勇老师:算法面试,有时候靠“运气”,但我想说的是,“运气”是实力的一部分。书山有路勤为径,努力提高实力真的没有捷径。算法面试的通过率往往和你面试过程中发挥的状态有很大关系。
如何让自己正常发挥呢?我会先拿几个小公司或者独角兽公司来练手。一方面,试试自己的能力;另一方面,尽量拿几个offer保底,将来好跟大公司讨价还价。
最重要的是把自己的状态调整到最佳,包括和面试官交谈时的状态、是否能清晰地分析问题、如何把自己的思路完美地告诉给面试官,最后是书写代码的水平,也就是能否能流畅地写出可读性高的代码。
▼
IT 君:作为 Google 的面试官,您是如何考察求职者的?什么样的求职者容易被选中?
苏勇老师:45分钟的面试时间真的很有限,我一般从以下方面考察求职者:
1、专业领域知识
这点可以从面试开头的谈话中得知。一般面试官都具有面试职位相关领域的知识,贴近这个专业知识聊天可以说是完全加分的点。
2、算法知识
通过半个多小时的解题过程,可以让我看到求职者是否能正确地理解问题、剖析解题思路,并迅速写出代码。
其实,无法在规定时间内完美地写出代码并不是世界末日,只要求职者对问题分析正确,把握了正确的思路,代码能清晰地看到输入和输出的逻辑、结构,最重要的是能迅速地将思路转变成部分代码,就能让我很满意了。
3、整体表现
另外一个面试官比较看中的方面就是:面试官是否愿意和求职者将来一起工作。
如果求职者的算法知识无可挑剔,但是在解决问题的过程中缺乏和面试官的交流,甚至对面试官的疑问不屑一顾,那又怎能让面试官放心跟他一起工作呢?所以面试者的沟通能力也是一个考察点。
▼
IT 君:您是力扣(LeetCode)的骨灰级用户,贡献过许多算法面试问题的解题方案,为什么要在算法方面下这么大功夫?为什么选择帮助广大程序员提高算法能力?
苏勇老师:之所以要在算法方面下大功夫,主要是因为算法在国内外大厂的面试里都占了相当大的比重,空有一身所谓的“经验”,功底却很差,那么很难从顶尖的大公司里拿到好offer。
Linux 之父 Linus Torvalds 说过一句话:"Talk is cheap. Show me the code." 中文翻译就是,能说算不上什么,有本事就把你的代码给我看看。
正如我前面提到的,算法面试除了考察你的基本功是否扎实之外,更重要的是要看看你能不能迅速地将思路转化成没有 bug 的代码,如果没有一定的功夫,是很难在短时间内达到高要求的。
力扣(LeetCode)帮助了我很多,我从这个平台上丰富了自己的算法知识,从广大网友的各种精妙的解法中体会到了快感,这让我不再惧怕算法面试,这个平台让我在求职道路上实现了自己的梦想,作为回报,我也希望尽自己的绵薄之力,将我的多年实战经验和刷题心得分享给大家。
IT 君:感谢苏勇老师的分享!
由拉勾联合力扣(LeetCode)独家合作,邀请到 Google 苏勇老师共同打造的《300分钟搞定算法面试》课程上线啦!(戳绿字链接了解详情)
更可联系微信号kaiwubzr3 领取10本算法相关电子书 、加入算法精进群~
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。