大家好呀,我是「小鹿鹿鹿」,我又来啦~~趁大家还有依稀印象赶紧乘热打铁~~这次聊一聊关于面试的一些小想法,希望和大家交流交流~~
虽然资历尚浅,但是也面过不少试,有Google、微软等外企大佬,也有BAT等国内巨头,工作的这几年也有幸当过几次面试官,小鹿这里呢就结合自己的亲身经历,聊一聊我对面试的一些小想法(*^▽^*)
我们面试是在面什么?
technology
thinking
communication
这是小鹿自己总(意)结(淫)地面试的主要考核内容。首先呢,毋庸置疑,我们面试肯定是要检验候选人是否有过硬的专业技术。算法、项目经历,不同的公司、不同的职位有不同的侧重,但是具体的专业技术的考核肯定是逃不开的。
可是除此之外呢?除了显式的技术考核以外,还有很多往往被我们忽略的隐形考核。小鹿觉得主要是思维方式和交流能力这两点。并且这部分反而更需要我们广大的程序员小哥哥们多多注意。不要让交流的问题,妨碍面试官发现你的思维之光,阻碍你展示出自己超强的专业素养呢(ノ≧∀≦)ノ!
面试实际上是工作的一个简单模拟。
一场面试,面试官其实只需要得到一个问题的答案,那就是和你一起工作是否开心。关于这个问题,有的外企会直接作为面试记录。虽然我们国内的企业不会这么直接,但是小鹿觉得这确实是面试中最直击灵魂的拷问。
面试的正确姿势
面试实际上是通过提出问题、回答问题,在你来我往中进行交流,模拟实际工作的情形。那么当面试官抛出话碴,提出一个问题之后,我们应该怎么更好的完成我们之间的对话呢?
小鹿以为,不管是具体的算法还是项目问题,面试官向你抛出的问题往往是开放的,没有灰常灰常清晰的定义、十分确定的唯一解的。针对这种情况,小鹿觉得切忌!!
不要直接给一个确切的回答,即使你的回答大概率是面试官心中想要的答案。
首先,我们可以尝试着去复述(当然不是一字不变的重复),用自己理解的语言去确认是否清楚的理解了面试官的问题。其次,这个问题可能存在一些没有定义清楚的模糊地带,一定要逐个向面试官去确认。当问题已经比较清晰的情况下,我们可以提出一个解决方案,这个方案可以是非常naive但是只要确实可行就ok啦。
大胆说出自己觉得可行的方案,即使这个方法看起来很简(智)单(障)。
能解决问题的方法就是好方法( ̄▽ ̄)/
当然啦,实际中我们需要精益求精寻求更优的解决方案。但是大家不用太有压力,我们可以和面试官一起,沟通交流,碰撞思维的火花,共同讨论出一个较优的方案。最后实现(写code),测试,over~~
所以,小鹿划重点啦,面试的正确姿(步)势(骤)应该是这个样子滴~~
step 1: 正确的理解问题并复述
step 2: 清晰问题
step 3: 提出一个可行的解决方案(不一定是最优的)
step 4: 讨论出一个较优方案
step 5: 执行实现
step 6: 测试
实战
读到这里是不是觉得小鹿就是一个纯理论派(差点意思????️),那么我们就以小鹿最近的一次面试来实操一下吧!
Q1: 寻找三角数组的最大值
满足先单调递增再单调下降的array为三角数组,如[1,2,3,2,1].
step 1: 复述 (内心OS...这道题怎么这么简单,我有没有正确理解题意呢-O-)
step 2: 数组为空怎么办呐(╯﹏╰)b?
step 3: 可行方案「遍历」,时间复杂度为O(n),空间复杂度为O(1)
step 4: 更优方案「二分查找」,时间复杂度为O(logn),空间复杂度为O(1)
step 5: coding
step 6: test
Q2: 判断一个数组是否是三角数组
step 1: 复述(小鹿此处就省略啦)
step2: 数组为空?长度小于等于2的特殊情况?
????试官明确边界,只有长度大于等于3的数组才可能是三角数组????
step 3: 可行方案「遍历」
遍历数组,如果数组只有一个拐点Xi-1<Xi且Xi > Xi+1,则为三角数组。时间复杂度为O(n),空间复杂度为O(1)。
step 4: 更优方案?
请勇敢的说出没有更优方案,没有比O(n)更高效的算法啦 (▼へ▼メ)
Q3:当数组非常大,无法直接放入内存时,如何判断其是否是三角数组?
考核大家思维能力的关键时刻到啦!
首先我们可以提出一个大致的解决思路。小鹿有一个不成熟的小想法,可以用map reduce,把数组进行切分,逐个处理每一小部分数组,再整合判断整个数组是否是三角数组。
这个时候呢,我们的解决方案并不完整,比如如何分割数组,map和reduce到底怎么定义还不清晰。但是呢没有关系,我们先抛出自己idea,然后根据面试官的反馈,确定我们的方向是否正确(ง •_•)ง
当我们得到面试官的肯定后,就需要进一步细化这个solution啦。
三角数组有且仅有一个拐点。直接切分数组(比如n等分),「map」分别数每个切分数组的拐点数,「reduce」对所有拐点数求和,如果拐点数为1则为三角数组。
但是??如果切分的位置正好遇到拐点怎么办呢?
不要害羞,说出自己的思考过程,善良的面试官会给你发(提)糖(示)。
????我们可以有重叠的切分,这样就能保证万无一失啦( ̄▽ ̄)/????
请看图,把数组划分为红、黄、蓝三个部分,其中重叠部分变成了橙色和绿色。这样就能保证即使把数组切分,也不损失整个数组的信息。
最后的总结
当我们面试大厂的时候,保持平常心,把面试当成和同学、同事的交流,是非常重要的。在自身实力一定的情况下,不同的面试方式可能产生不同的面试结果。大家不妨也回顾总结一下自己的面试心得,有好的面试技巧可以在评论区留言,和大家一起交流学习哦~~~
希望大家面无不胜,逢考必过( ̄︶ ̄)↗