在Programming Interviews Exposed一书里,对如何回答技术问题非常完全的总结。有许多人都读过这本书,但不知道是不是每个人都仔细读过第三章 -- Approaches to Programming Problems。建议每个准备面试的同学,每天都用5分钟,把第三章的原则和步骤复习一遍。今天我们就一起来复习一下。
- 理解问题 -- 当面试官把问题陈诉给你后,你最初的理解往往会有偏差或者漏洞。这并不是因为你笨或者理解能力差,而是有些面试官很坏很狡猾,他们会故意把问题说得模棱两可,模糊不清,因为“是否懂得如何澄清问题”也是他们的关注点之一。所以,当你觉得问题有不清楚的地方,就要大胆发问。读过Programming Pearls第一章的朋友一定会对如何理解问题讲严重影响如何解决问题有深刻体会。确认自己是否正确理解问题的一个方法就是用自己的话来重新表达问题,并向面试官确认,自己的重述是否正确。
- 有些问题也许不容易用语言来简单清晰地表达,那么就从一个简单的例子开始,用这个例子来确认自己对对问题的输入,输出,条件限制都理解正确。从一两个简单的例子开始的另一个好处是:使得解决问题更加直观,一些可能的解决方法会从例子上浮现出来。
- 有了以上两步,就可以集中精力思考以何种算法解决你的问题。在这个过程里,一个关键的做法是要Think aloud,就是把自己脑子里想到的大声念出来,这不但有利于面试官了解你的思路,也有利于你自己理清思路。(当然,如果你脑子里想的是“TMD,这题怎么这么难!”,那就不要念出来了。)另外,即使你解释了为什么你认为一些算法不适合,是因为不够优化,还是不能完全解决问题,这也对面试官能正确评估你有好处。
- 当你认为你已经找到解决问题的算法后,可以开始往白板上写了吗?No,在往白板上implement你的算法前,先向面试官解释你的解法。这可以让面试官先对你的算法有个评估或者是了解。有的同学费了半天劲把代码写完,但是其算法和面试官期望的相差很远,或者不必要地复杂化。另外还有一部分同学常抱怨自己的高明算法面试官都没看懂,这也许是真的。但是你是去面试,而不是打擂台,你让面试官看不懂你的解答,就以为被拒的杯具。
- 在白板写代码时,除了一些非常明显的地方,你要边写边解释每个变量是做什么用的,每个语句是做什么用的。这就像你在给你的代码加详细的注释,这不但对面试官理解你的代码有帮助,有有利于你自己follow自己的思路并有助于后面tracing thourgh和debug。
- 对于一些记不太清的细节,大胆地问,不要因为一个function的parameter记不清了,就卡在那里。
- 代码完成后,马上用第2步中的例子来trace through,大部分的bug都是在这个解答发现的。
- 再次检查你的代码对于错误有没有合适的处理,并增加boundary condition的测试。