当前位置: 首页 > 科技观察

程序员如何在面试中准备算法

时间:2023-03-17 18:48:47 科技观察

春招季临近,大家已经开始准备面试,拿到心仪的offer。此次lucifer将从面试官的角度为大家分享一些面试技巧,让你在面试中少走弯路。本次分享聚焦“算法面试”。我负责公司的面试已经5年多了,基本都是一、二面。所以技术面试的层次比较深,更多的是了解应聘者的技术能力是否达标。在过去的几年里,我也来回面试过很多候选人。这些人有的技术能力很差,但是很遗憾,有的人技术能力很好,但是没能通过我的面试。为什么?面试考察什么?首先,判断应聘者能否通过面试,通常有以下几个标准:1、胜任能力2、沟通能力3、工作热情。..那么我在面试的时候也一定要关注上面的,但是我只是关注不同点。算法题和编程题其实都可以很好的测试上面的信息,而不仅仅是测试“能力”。前提是面试官不能太死板,比如直接扔一道原版的网络题,有的甚至不怎么擅长就拿出来应试。这是绝对不能接受的。有同学反映算法题目做完了,但是面试失败了。这就是为什么?除了那些理所当然的,cornercase其实没有考虑或者不是最优解。还是有可能被挂掉,为什么呢?事实上,你在题目上做得很好,但你只能证明你“称职”。这并不意味着其他的要求也都满足了,比如上面提到的沟通能力,工作热情等等。那么如何更好的展现自己,给面试官留下更好的印象,通过面试呢?除了提高自己的技术实力,方法也很重要。在这里,我为您总结了一些技巧。算法面试基本步骤1、在网上找了本《Interview Cheat Sheet》。此PDF列出了面试的模板步骤,并提供了有关如何逐步完成面试的详细说明。这个pdf开头提到了好代码的三个标准:可读性、时间复杂度、空间复杂度,写的非常好。紧接着,列出了算法面试的15个步骤。比如step1:面试官提问完之后,你需要先归结到重点(然后在下面写注释和代码)。看完之后,我的感觉是,只要按照这个去做面试,成功率就会慢慢提高。2.多问几遍,确保问题理解正确。比如输入输出,cornercase等等。试想有同事拿到需求,胡乱做了,结果发现做错了,该有多尴尬?你愿意和这样的同事共事吗?例如,你可以问:你需要考虑负数吗?结果的顺序重要吗?可以使用额外的空间吗?...3、先谈思路,再写代码。虽然理解题目没有问题,但是思路可能根本就错了,或者面试官不想要这个解决方案。想象一下,你是一名面试官,你写了半天代码。这个想法根本不对或者不是你想要的解决方案。你是不是有点失望?所以尽量先谈思路,面试官觉得没问题再写,“不要浪费彼此的时间”。比如你可以说:简单暴力的idea是:xxxx。而这样做的时间复杂度是xxxx。简单暴力算法的瓶颈在于xxx,我们可以使用xxxx算法进行优化,这样就可以将复杂度优化到xxxx。4.在上一步向面试官解释思路时,代入几个例子。cornercase和normalcase至少是一种来说明。这样不仅会让面试官觉得你有很强的沟通能力,还能帮助你进一步理解题目,理清思路。有时候面试的时候大家都很紧张,用例子解释后紧张感会逐渐减轻。就像我在做技术分享的时候,往往前几分钟很紧张,后面就不会紧张了。比如你可以说:当输入是[1,2,3,4]时,我们先计算xxxx,这样就是xxxx,然后计算xxxx,最后是xxxx。当输入为负数时,我们可以直接返回xxx。5.快速写代码,不要来回改,否则会被贴上写不好的标签。其实有了前面的铺垫,快速写起来也不难。因为上面其实讲了思路,通过例子讲解的方式你已经对算法有了很好的理解。但是没有问题的想法不代表可以完全写出来。也可以完全写出来,不是说不用画改。这就需要大家在做题之前先勾勒出代码的大致框架。一个简单的技术是:“在模块中编写代码,每个函数一个函数”。这减少了不断涂抹和修补的机会。一个例子:defsolve(nums):defcheck(mid):#dosomethingdefanother_func():pass#...l,r=0,len(nums)-1whilel<=r:mid=(l+r)//2check(mid)其中solve是主要函数,而check和another_func是拆分函数。6.写完代码,先写一个测试。这不仅体现了你良好的编码习惯,也有助于你发现代码是否存在问题。提示:你可以把你和面试官给的例子和面试官给的例子替换一下,看看是否正确。因为有之前的铺垫,这应该也是很快的。一个例子:defsolve(nums):defcheck(mid):#dosomethingdefanother_func():pass#...l,r=0,len(nums)-1whilel<=r:mid=(l+r)//2check(mid)assertsolve([1,2,3,4])==Trueassertsolve([])==False#...这里我们使用assert来断言。类似于我们日常开发后对代码进行测试。最后整理一张流程图给大家,方便大家记忆,也可以把图保存起来,以备后用。