许多扣友在技术面试时最常见的一个疑问是:如何应对一道白板编程题?
所谓白板编程题就是在白板上或者编辑器里完整地解答算法或者数据结构的问题。遇到白板题,有的人两眼发黑,根本没法去思考,还有的人会说:我这个题回答得很好啊,为什么面试没有过?
针对这个问题,接下里我会给出一个解题五步走
的模板,希望对大家有所帮助。

在此之前,我们首先需要了解为什么会有白板面试的过程。需要明确的是,它一定不是一个考试。面试是一个交流的过程,我们其实模拟的是在现实情况下解决问题的过程,所以千万不要不好意思去问一些问题,甚至去要一些提示。
解题五步走
第一步:明确题意 
很多扣友拿到一道问题后觉得这道题目我看过,或者我已经有思路了,于是直接就开始写解答。但是,有的时候题目的描述并不是很清楚,有的时候可能有一些边界条件、边界问题没有非常直白地告诉你应该去怎么处理,这时候你需要问面试官一些问题
问的问题包括题目本身,比如有的题目题干比较长,你并不是很理解它在说一件什么事情,你可以用自己的话描述一下,确认你的理解是正确的。第二,你可以事先想想,这个题目会有哪些边界条件,并且预期面试官会有一个什么样的解答。
第二步:大致描述你的算法思路
这一步也非常关键,原因在于有可能你想的方法其实并不是面试官所想的,或者并不是面试官认为足够有效可以解决这个问题的。
所谓的描述一个大致的算法就是一个打草稿过程你可以想象果面试官让你去画一幅画面需要画五个人你的第一步肯定是用铅笔先在稿纸上大致把五个人的位置画好而不是上来就画细节。
当我们描述时,可以从一个最简单的思路讲起,再到更优化的。举一个简单例子,你要在一个数组中,选出第 k 大的数。可能你直觉的想法就是把它排序一下,然后取到第 k 大。但实际存在更优的解法,比如用 k selection algorithm 达到 O(n) 的一个选择复杂度。
就这样,通过描述算法,你已经在逐渐形成你的思路
这样做有两个好处。第一,你的算法不至于跑的太偏。第二,至少有一个保底的做法。哪怕你只想到了暴力解,至少不至于这道题目一行代码也写不出。
在描述的过程中,也可以借助一些方法技巧。比如可以写一些伪代码,或者加一些程序的框图,帮助你把你的思路转化成代码。
第三步:写代码
这一步需要注意一些细节问题。
在明确题意的时, 既然已经知道了哪些是 edge case,所以你的代码一定要去处理这些边界的条件。
你需要有一个良好的代码书写习惯,包括你的命名规范。当你定义变量的时候,不要图省事就用 int A、int B。这些其实在面试中都是一些 Red Flag。
如果你想说这个变量名应该是取某个名字,但是为了手写简单我用了这个缩写,至少要将这些想法表述出来,给面试官留下一个你有好的书写习惯的印象。
好好利用一些子函数,把应该放成一个模块的内容写成子函数,而不是直接摊在你的整个函数里面。这时我们就回到第二步,当你在描述思路的时候用铅笔画出了一个粗框架,对于里面的每个步骤,你可以考虑是不是要把它变成一个子函数。
你甚至可以向面试官解释这个子函数是为了实现一个什么样的功能,但是限于时间我先跳过。可能面试官觉得你的思路很清晰,就不需要你去写这个函数了。这样不至于把大量的时间花在一些非常细节的问题上,而能够保持你面试流程流畅。
写代码的过程中,你需要跟面试官保持沟通,让 Ta 知道你在想什么。而且一旦偏差得太远,希望面试官能够把你拉回来。如果你碰到了一些问题,可以及时地问面试馆要 hint(而非答案) 。比如,我现在在想什么问题,碰到了什么样的困难, 我觉得这样可能可以,你能不能给我一些更好的建议。
第四步:测试你的代码
很多扣友写完代码以后非常开心,直接就对面试官说:我完成了,你来看看我写的对不对。但事实上,这句话就相当于在考试中交卷了。一旦你里面有问题,或者有没有考虑到的地方,都已经板上钉钉了。
所以,不要急着说我写好了,而是应该通过一个测试用例来测试一下你的代码是不是能够顺利运行。如果是在白板上答题,可以给出一个示例,像 debug 一样一步一步地去执行你的代码。如果是在编辑器里, 你可以给出一个测试用例来大致跑一下。
小提示: 如果在面试的过程中,你通过测试发现了代码中的问题,并且及时把它改正了,这会是一个加分项
第五步:简单分析一下算法复杂度
主要是时间复杂度和空间复杂度。做这一步的理由就是让面试官认为你有一个比较好的基础素养,能正确地评估自己代码的复杂度。
不过这一步整体来说是 optional 的,并不一定要去做。所以如果你不确定自己的答案,那就先不说,除非面试官明确地问。
模拟面试实战
光说不练假把式,如何在实际面试中灵活运用「解题五步走」成功通关呢?那就用一场模拟面试来实战演练一下吧!
点击观看完整视频↓
面试官 & 候选人介绍:
Emma 和 Roger 一起毕业于北大本科,加州大学硕士,现在坐标硅谷。目前分别在硅谷大厂和独角兽做 engineering manager,曾拿过 20+ 中美顶级科技公司的 offer。关注我们的频道:油管 Emma ZhengB站 geniusroger2000,分享了如何刷题突破瓶颈期、程序员如何爬 career ladder 等内容,之后会进一步分享如何选择公司/组/老板,晋级到高 IC,IC vs manager track,小公司 vs 大公司等等。
点个在看,少个 bug👇
继续阅读
阅读原文