作为程序员,在面试过程中都需要经历一次又一次编程的考验,这其中有何技巧可言?又该如何通关成功拿到心仪的offer呢?
作者
DailyCodingProblem
译者
苏本如,责编
屠敏
以下为译文:
关于编程面试中遇到的困难和算法问题,我们已经讨论了很多,但是首先在面试环境中让自己保持舒适本身就是一种技巧。
除了提出正确的解决方案之外,在每次编程面试中,你还需要做一些额外的事情。
要求澄清问题。运行你的算法并用测试用例进行验证。主动提供算法的时间复杂度和空间复杂度信息。很多时候,应聘者会立即全神贯注于编写代码,而忽略了做上面的一件或多件事情,这会对他们的面试结果产生负面影响。面试官肯定会发掘出应聘者编写正确算法的能力,但他们也会基于沟通能力和验证能力等其他技能来评估应聘者。
要求澄清问题
在开始编写代码之前,一个好的应聘者总是会问清楚面试官提出的问题。这有三个主要目的:
它缩小了问题的范围。例如,也许你会问面试官,“这个数组中的所有整数都是正的吗?”。如果答案是肯定的,那么你就不必考虑整个负整数空间,这可能使问题更容易解决。它向面试官表明你正在积极考虑边缘案例。面试是为了证明你有能力进行批判性和周密的思考,同样也是为了证明你的原始编码能力。它允许你和面试官就问题的理解达成一致。因为有些时候,我给了应聘者一个问题,他们提出的解决方案却稍有偏差。所以在开始之前,确保你和面试官对你要解决的问题的理解一致。
验证算法
在面试过程中,仅仅在黑板上写好代码并称之为“完成”是不够的。一个高质量的应聘者总是会用边缘案例和例子逐步检查他们的算法以找出任何错误。这是几乎每个面试官都希望看到的关键步骤。
在验证算法时,尽可能周密。下面是一些提示:
在算法的每个步骤,写出存储在任何数据结构或变量中的内容。如果执行for-或while循环,请确保运行算法直到完成,以捕获任何“off-by-one”错误或终止错误。选择non-trivial的测试用例。可能是该算法适用于特定的输入集,但不适用于更复杂的输入集。尝试提出破坏算法的测试用例。理想情况下,你写的算法没有任何缺陷,但现实中更可能发生的是,你会发现一些小错误。通过修改算法来修复这些错误,并再次运行几个测试用例,将能很好地反映出你的代码调试能力。
提供算法的时间复杂度和空间复杂度
几乎每个面试官都会关心算法的时间复杂度和空间复杂度。主动提供这些信息,而不是等待他们询问,可以向面试官表明你熟悉这些概念,并且可以轻松计算这些信息。
需要牢记的一些事情:
当开始考虑一个问题时,试着想想绝对的最好和最坏情形时的复杂度是什么。例如,要在未排序的列表中查找某个元素,我们知道必须至少查看列表中的每个元素一次,所以这个算法的复杂度至少是O(n)。试着用“压力测试”测算一下你的算法的复杂度,尤其是当它依赖于两个或更多的变量时。例如,如果你的算法执行次数是O(n*k):如果k非常小会发生什么?当k接近n时会发生什么?有时,你会发现一个算法对于特定的n和k值是最优的,另一个算法对于不同的n和k值是最优的。对于内存限制,如果你确实需要跟踪数据结构中的所有值,请尝试解释。此外,还要认识到一个事实,即不同编码语言中的某些函数可能会使用额外的内存。一个很好的例子是在Python中进行列表切片,这会创建一个新的列表(可能会产生另一个O(n)内存使用)。编码面试是很困难的,精通算法和编码问题并不能保证总是能够通过面试。幸运的是,有了这三个技巧,你可以更好地了解如何进行编程面试。祝你好运!
你正在面试编程工作吗,还是只是喜欢有趣的编程问题?查看我们的时事通讯-DailyCodingProblem,你就能每天在你的收件箱中收到一个关于编程的问题。
原文: