目录
前言
虽然资历尚浅 , 但是也面过不少试 , 有 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 则为三角数组。
但是 ?? 如果切分的位置正好遇到拐点怎么办呢 ?
不要害羞 , 说出自己的思考过程 , 善良的面试官会给你发 ( 提 ) 糖 ( 示 )。
💡 我们可以 有重叠的切分, 这样就能保证万无一失啦( ̄▽ ̄)/💡 请看图 , 把数组划分为红、黄、蓝三个部分 , 其中重叠部分变成了橙色和绿色。这样就能保证即使把数组切分 , 也不损失整个数组的信息。
最后的总结
当我们面试大厂的时候 , 保持平常心 , 把面试当成和同学、同事的交流 , 是非常重要的。在自身实力一定的情况下 , 不同的面试方式可能产生不同的面试结果。大家不妨也回顾总结一下自己的面试心得 , 有好的面试技巧可以在评论区留言 , 和大家一起交流学习哦~~~
希望大家 面无不胜 , 逢考必过( ̄︶ ̄)↗
原文链接:https://blog.csdn.net/xixiaoyaoww/article/details/105460402