首先感谢朋友的内推。
总体面试下来,感觉Cresta的人都很专业,不会像某些群体上来问“how do you rate your python skill, from 0-10"。因为整个面试(尽管最后挂了)算是一气呵成,我大概都讲了吧。这四场面试的都是华人,基本都非常nice。
1st : HR or Manger面试 30分钟
2nd: 技术面 Practical Coding 1小时
3rd: 技术面 * 3
3.1 Practical Coding 1小时
3.2 Algorithm & Datastructure 1小时
3.3 System Design 1小时
因为挂在了3.2 所以还是没有System Desgin的经验
面的岗位是 MLE,但是和 第一轮的Manager聊后不是特别匹配,他和HR超级nice地把其他组推荐给我并且直接进入第二轮的技术面。面试官小哥能根据我的回答提纲挈领地整理信息,然后最后总结并且能引导我。强者光环隔着屏幕就可以感受到。
2nd-技术面-practical coding:就是根据注释写一个rate limiter。面试小哥人超级无敌nice,然后在我不太熟悉(把问题复杂化了)的时候会耐心引导解释,其实基本上就是实现一个 Fixed Window Counter的 Rate limiter。大家可以参考这个链接 Rate Limiting Algorithms Explained with Code。在提示下勉强写出来了。第二天晚上就发了下一轮的邀请
3rd-技术面-practical coding:比较有意思。面试小哥也特别特别nice。模拟一个Pull Request的code review。比如我抽到的场景是:有一堆虚拟资源,然后在特定时间段会被占用处理任务,处理任务有一些规则。然后有个员工某次发现了这个处理任务的效率异常缓慢,然后写了个PR进行分析。然后我就要去Review 这个PR。 可以说的地方很多:(1)代码规范问题 (注释呀 变量名取名)(2)因为我面的是python,所以我会建议某些方法改成某个类的,就是根据面向对象编程的思路 (3)很重要的一点,也是我复盘没有做的特别好的:就是代码会有一些逻辑错误,一定要理解业务逻辑同时也要细心。比如一个方法的形式参数根本没被调用。再比如一些变量,根据业务逻辑命名,会有特定的调用数值的方式(举个例子,一个previous_value是要从现有的或者从前的list读取,而不是new一个新的,在新的循环里处理)。我发现了一些但是没有全部发现。
3rd-Algorithm&DataStructure。
题目基本就是LC56区间合并的变体。就是给定若干时间段(表示某段时间内有 conversation),求没有 conversation 的总时长。
输入:
snippets = List[Tuple[int, int]]
复制代码
输出:
no_conversation_time: int
复制代码
但是第一眼瞅过去,脑子却直接联想为“用差分数组标记某些区间,然后在未标记的区间内求时长”。在面对很稀疏(或者间距特别大的数据)的测试样例时会超时,然后其实这算是我这两三年第一次正儿八经面leetcode类似的题,所以自己手很生,也没特别主动想到一些刁钻的edge case。尽管过了给的测试样例和一些基本的,但是面试官小姐姐一针见血看出了这个问题。在最后由于时间问题我没来得及优化(按照区间合并的正规写法)。
补充下大概正确思路: 去重(可选)、排序、合并区间并且在两个不相邻区间求差值 (代表no conversation)、计算占用时间总和
然后最后一场面了6天后给了拒信。
希望能给大家带来一些参考和帮助。