为什么要学习数据结构和算法?理由有很多,比如锻炼逻辑思维、写代码时候的复杂度思维、学会将数据结构和算法应用到项目、提高阅读开源代码的能力等等,但是对于很多小伙伴来说,我们不得不承认,最务实的目的,最急切要解决的问题,是应付算法面试,面试的时候不再惧怕被问到算法问题。
 
不过,话说回来,面试中面算法的公司并不多。喜欢面算法的公司主要是些BAT量级的大公司,但这些公司毕竟不多,而且,如果是社招,仅仅leetcode刷的好,也不能让你进这些公司,因为毕竟他们还会看其他方面的东西,比如你的项目经验、过往工作履历等。而大部分中型公司、小型公司、A/B/C/D轮的创业型公司,都不怎么会面试算法。而且,如果你是毕业很多年的资深工程师,那更不大可能从基础的算法面起了。
 
说这些的主要目的并不是不推荐你刷题,而是要适度刷题,业余时间偶尔刷刷,做到看到算法问题不心虚就好了,不要把重心完全放到刷题上。多积累项目经验,做好项目,才是职场发展的王道。
 
对于算法面试,我当年校招的时候,算是算法面霸,现在应该也是,不夸张地讲,我遇到的大部分面试官的算法能力可能都还没有我强。对于算法面试,我也有一些心得、经验,可以分享给你。
 
实际上,应付算法面试就一个窍门,那就是“题海战术”,其他面试技巧之类的都是锦上添花的事情,掌握起来也都很快,随便百度、google一下一大堆,如果这些你都觉得不够,不想自己去搜,还要别人手把手教,那基本上就可以放弃学算法了,毕竟学算法是件很动脑子的事情。
 
所谓“题海战术”,说白了就是OJ刷题。刷题网站有很多很多,主要分为两类,一类就是类似leetcode这样的,主要是为了面试,题目难度相对低一些,另一类就是各大高校的OJ,比如北大的POJ,主要针对acm竞赛的训练,题目难度要比前者高一些。
 
当年我刷题的时候,leetcode上才只有不到100道题目,所以,我当年主要在各大高校的OJ上刷题,零零总总大约刷了1000道题目的样子。现在leetcode上有上千道题目,已经是最流行的面试刷题网站了。所以,如果你是为了应付面试,只刷leetcdoe就我觉得就够了。
 
虽然我前面说了,应付算法面试没什么技巧,就是题海战术,要自己多去刷题,不过,今天我不打算讲如何刷题哈,因为我刷题的经验已经过时了(现在都是刷leetcode)。今年,我打算花些时间,把leetcode上的题目刷一遍,然后再来给你讲。更进一步的消息,你可以持续关注我的公众号。
 
今天,我主要讲一下,算法面试中的一些小技巧,在你题目刷的差不多的时候,这些小技巧能帮助你面试现场更好地发挥。
 

1. 多搜面经、知己知彼

在面试前,你要多搜下面经,看看要应聘的公司的面试题难易程度和面试官的喜好,有针对性的准备。比如有的公司喜欢面试动态规划,面试前就去leetcode多刷下这类题目,有的公司的算法面试比较简单,面试前找简单题目练一下就好了。当然,这个只是为了有个大概的了解,要想压到题目还是很难的。因为很多公司,比如Google,要求如果某个题目已经被泄露,坚决就不能再被使用。
 

2. 练习白板编程

我们平时都是在IDE中写代码。IDE本身有自动提示功能,而且可以随意修改代码。但是,在面试中,我们一般都是在白板或者纸上写代码。而在纸上写代码,对整洁度的要求很高,因为写好之后就不好改了,不然改的乱七八糟,面试官会觉得你思路混乱。所以,在面试前,你要在纸上多练习一下,能够做到脑袋里想好算法之后,能一气呵成的写出代码。如果实在写的太乱,写完之后,再重新抄一遍。所以,去面试的时候,自己多准备几张白纸,以免面试官给你的纸不够用?。
 

3. 尽量保证代码没有bug

实际上,算法面试不仅仅考察你的算法能力,还考察你的代码能力。你的代码是否能做到bug free这个非常关键。在面试中,如果你写出来的代码,bug很多,即便算法正确,也不大可能被录用。所以,在写代码的时候,你一定要注意非法输入的判断、一些特殊边界情况的处理。在写完代码之后,你也要认真检查一遍,并且用测试用例检查一下你的代码是否能运行正确。测试用例起码要包含正常情况、错误情况、以及一些边界情况(corner case)。
 

4. 尽量保证代码规范

除了刚刚说的代码要没有bug之外,你还需要注意代码规范,比如变量、函数的命名一定要规范,可读性强。大的代码片段要拆分成小的函数、模块,这样不管是面试官读你的代码,还是你自己写代码,都会比较清晰些。如果你代码写的不规范,有些面试官会因此联想到你工作中写代码是不是也不规范呀。
 

5. 要有时间意识

实际上,面试官不只是看你是否能想出算法、写出答案,对于一些简单算法题目,面试官还会考察你是否能快速写出代码。如果简单题目都写的磕磕绊绊,在很多优秀的候选人中,你就很难脱颖而出了。一般来讲,一个算法题目的思考时间不能超过10分钟(不包括代码实现)。超过10分钟,你就会紧张,面试官也会等的不耐烦了?。所以,很长时间想不到解题思路的时候,要多个面试官沟通下。
 

6. 先用最简单的方法解决

一般来说,我的一个面试习惯是,拿到一道算法题目之后,先想最简单的解决办法,说给面试官听,然后再行优化,想更加好的解决方案。这样做的目的,一方面是缓和自己紧张的情绪,不至于脑袋放空、卡壳,另一方面,一开始就想最优的解法,可能要闷头想很久,面试官很难知道你的进度,也没法做指导。
 
总结
面试官不只是考察你的算法是否正确、最优,还会考察你的代码是否整洁、可读性是否好、逻辑是否清晰,对于简单的问题,是否能快速代码实现。当然,对于稍微难的问题,面试官也容忍一定的错误、bug、不完美。所以,如果某个问题回答的没有100%完美,也没必要因此纠结,影响后面的面试表现。
 
实际上,上面总结的这些都不是特别难掌握,也没有啥新鲜的内容,你在其他地方可能也都看到过。这些小技巧短期之内都可以速成,面试前一两周稍微练一下,面试的时候稍微注意一下就可以了。我个人觉得,我写这篇文章,对你价值最大的就是下面这句话:要想算法面试应对自如,最重关键就是要多刷题,没有捷径。

原文始发于微信公众号(小争哥):小争哥的算法面试经验分享