春招季降临,大家陆续曾经开始筹备面试斩获心仪 offer。
这次 lucifer 就从面试官角度给大家分享一些面试技巧,让大家面试时少走弯路。这次分享偏重 算法面试。
我负责公司的面试曾经有 5 年以上了,根本都是初面和二面,因而技术面试的层面比拟深,更多的是理解候选人的技术能力是否达标。在这几年工夫,我前前后后也面试了很多的候选人。这些人中有的技术能力不行,但也有些人很惋惜,技术能力是能够的,然而却没能通过我的面试,为什么呢?
面试考查什么?
首先,通常判断候选人是否能够通过面试有如下几个规范:
- 技能是否胜任
- 沟通能力如何
- 工作激情如何
。。。
那么我面试的时候必定也是围绕下面开展的,只不过偏重考查不同罢了。
算法题和编程题实际上可能很好地测验以上信息,而不仅仅是测验 能力是否胜任。前提是面试官不能太死板,比方间接扔一个网上原题,有的甚至本人都不太会就拿进去考,这必定是不行的。
有同学反馈算法题目做进去了,然而却挂了面试。这又是为什么呢?
除了想当然的那种做的很好,实际上 corner case 没思考到或者不是最优解。还是有可能会被挂,为什么呢?
其实你题目做的很好,仅仅能够证实 能力能够胜任,这不意味着其余也满足要求,比方下面提到的沟通能力,工作激情等等。
那么如何更好地展现本人,给面试官留下更好的印象从而通过面试呢?除了进步本人的技术实力之外,办法也很重要。这里我就总结了几个技巧给大家。
算法面试根本步骤
- 我在网上找到一份《Interview Cheat Sheet》,这个 PDF 列举了面试的模板步骤,具体批示了如何一步步实现面试。
这个 pdf 结尾就提到了好的代码三个规范:
- 可读性
- 工夫复杂度
- 空间复杂度
这写的太好了。
紧接着,列举了 15 算法面试的步骤。比方步骤一:当面试官发问完后,你须要先下来关键点(之后再上面写正文和代码)看完我的感触就是,面试只有依照这个来做,成功率蹭蹭晋升。
pdf 地址
- 多问几次,确保题目了解正确。
比方输入输出,corner case 等等。试想一个共事拿到需要不分青红皂白就去做,后果发现做进去的不对,多难堪?你会想和这样的共事一起共事么?
比方你能够问:
- 须要思考正数么?
- 后果的程序重要么?
- 能够应用额定空间么?
- 。。。
- 先说思路,再写代码。
尽管题目了解没问题,然而可能思路基本不对,或者面试官不想要这个解法。
试想你是面试官,对面写了半天代码。思路基本就不对或者不是你想要的解法,是不是有点悲观?
所以尽量先说思路,面试官感觉没问题再写,不要节约彼此的工夫。
比方你能够说:
- 奢侈的暴力的思路是:xxxx。而这么做的话工夫复杂度是 xxxx。
- 奢侈的暴力算法的瓶颈在于 xxx,咱们能够应用 xxxx 算法进行优化,这样复杂度能够优化到 xxxx。
- 上一步骤给面试官讲思路的时候,代入几个例子。
corner case 和 normal case 都至多举一个来阐明。这样不仅让面试官感觉你沟通能力强,而且能够帮忙你进一步了解题目以及理清思路。
有点时候大家面试比拟缓和,通过代入例子解说紧张感会缓缓缩小。就如同我做技术分享,往往缓和的就是后面几分钟,前面就不会有缓和的感觉了。
比方你能够说:
- 当输出为 [1,2,3,4] 时,咱们的先 xxxx,这样就 xxxx,接下来计算出 xxxx,最初 xxxx。
- 当输出为正数时,咱们能够间接返回 xxx。
- 写代码要快,不要来来回回改,不然就会被扣上 coding 不行的帽子。
其实有后面的铺垫,写快不难。因为后面其实讲思路,通过例子讲解法你曾经对算法很理解了才对。
然而思路没问题不代表能够残缺写进去。同样能够残缺写进去不代表不须要涂涂改改。这须要大家做题目前先勾画出代码的大体框架。
一个简略的技巧就是:分模块写代码,一个性能一个函数。这样能够缩小一直地涂涂抹抹,修修补补的可能性。
一个例子:
def solve(nums):
def check(mid):
# do something
def another_func():
pass
# ...
l, r = 0, len(nums) - 1
while l <= r:
mid = (l + r) // 2
check(mid)
其中 solve 为主体函数,而 check 和 another_func 则为拆分的函数。
- 写完代码本人先写个测试。
这不仅体现了你代码习惯好,而且能帮你发现代码写的有没问题。
小技巧:你能够把后面你和面试官举的例子以及面试官给的例子代进去看对不对,因为有后面铺垫了,这个应该也很快。
一个例子:
def solve(nums):
def check(mid):
# do something
def another_func():
pass
# ...
l, r = 0, len(nums) - 1
while l <= r:
mid = (l + r) // 2
check(mid)
assert solve([1,2,3,4]) == True
assert solve([]) == False
# ...
这里咱们应用 assert 进行了断言。相似于咱们日常开发后对代码进行测试。
总结
最初给大家整顿一个流程图,不便大家记忆,大家能够把图存起来备用。
最初心愿大家能够在春招季斩获本人信息的 offer。也欢送大家进我的春招群。加我微信,回复春招即可进群。