本文转载自Udemy上的课程《Master The Coding Interview: Data Structures + Algorithms》,作者Andrei Neagoie。

优质代码的三个要点: 1.良好的可读性 2.尽量少的运行时间 3.尽量少的空间占用

面试官考察的技能:

  • 分析能力 —— 你是如何思考问题并分析事物的?
  • 代码能力 —— 你代码质量如何?是否简洁、有条理、可读性好?
  • 技术知识 —— 你是否知晓你所要应聘岗位的基础知识?
  • 沟通能力 —— 你的个性与公司文化是否相符?

解决问题的标准流程:

  1. 当面试官对问题进行描述时,及时写下关键信息(比如,有序数组)。确保你清楚所有细节。向对方展示你的条理性。
  2. 确保你再三检查:输入是什么?输出是什么?
  3. 这个问题背后的意义是什么?用不用考虑运行时间、空间、内存......?主要目标是什么?
  4. 不要一直问个不停,会引起对方的反感。
  5. 从最简单的方案开始。映入脑海的第一种思路。你不需要开始写代码,只需要说出来。这能让对方觉得你思维敏捷且周密。
  6. 告诉面试官这方法为什么不是最优方案。比如,运行时间在O(n^2)以上,可读性差,等等。
  7. 从头到尾演练一次你的方案,做出评估。试着想办法让程序出错。有无繁琐,有无瓶颈(如嵌套循环),有无冗余?你是否有遗漏已知条件?瓶颈就是 "Big O" 最大的代码块。集中处理瓶颈区域,它一般会造成重复工作。
  8. 开始写代码前,从头到尾想一遍并写下你要做哪些步骤。
  9. 按照一个个的模块来写你的代码。把你的代码拆分成一个个美观的小片段,当觉得有必要时加上一些注释。
  10. 现在开始写你的代码吧!提醒自己,写之前做的准备工作越多,你越清楚你要写什么,你代码写的就越好。因此,绝对不要在不确定代码是如何实现时就开始写。否则你的代码将不堪入目。记住:很多面试时间都不够你把代码写完整。所以要这样想:我怎么做才能让面试官觉得,我能解决这个问题,而且我比其他人更优秀?还要记得把代码拆分成一个个函数。(如果实在记不清某个方法,就自己编写一个,这样需要它的时候你至少还有的用。)开始写吧,从简单的开始写起。
  11. 思考测误,如何让自己的代码漏出破绽。永远不要认为输入值会符合你的理想预期。想象一下,有人不停地对着你的代码想方设法找漏洞,邪恶的Darth Vader正在使用你的函数。你将如何保卫它?永远要刻意检查你最不想要的错误输入值。有个技巧:一边把你要检测的错误输入值写在注释里 ...... 一边写着函数, 然后告诉面试官这些是用来进行测试的(你不需要真的把测试写出来)。
  12. 别用令人费解的变量名,如 i 和 j 。写的代码要让别人易于读懂。
  13. 测试你的代码:检查 无输入时、输入为0、undefined、null、巨大数组、异步程序、等等。询问面试官,觉得代码有无问题,有无重复,有无漏洞,能不能给出一个可以报错的输入值?
  14. 最后和面试官聊聊你的代码中有哪些可以改进的地方。代码是否可以顺利运行?有没有其他更好的办法?可读性好不好?你想去搜索什么知识来改进你的代码?怎样还可以提高代码性能?如果还有机会,询问他见过的哪种方法最有趣?
  15. 如果面试官对你的解决方案很满意,那么面试到这里就进入了尾声。通常,面试官可能问你额外的问题,比如假设输入值非常大,超过了内存的阀值,或者输入值是数据流,你会怎么做?在谷歌这样注重规模公司,这样的附加问题很常见。通常,答案都是“分而治之”——分布式处理数据,只把一定数量的输入值由硬盘放入内存,把输出值写入硬盘再汇集到一起。