他家电面有2轮,等待onsite。。
。
电面1:
国人MM面的。这点感觉非常难得。
统计近期5分钟的点击量,实现hit和getHit两个函数。这题是他家高频题,我用deque实现的,hit的均摊时间是O(1)。认为应该差点儿相同最优了吧。
后来要求写个并行程序,忘记问是写共享内存的还是分布式的了,写的有点卡。有时候纠结究竟用lock还是用多个local copy。感觉设计起来事实上就是CAP理论的实践。假设要求consistency。就不能partition,或者说使用lock的话availability会非常低。
假设我做多个local copy。感觉无法保证consistency。最后没时间了就仅仅是谈了下大概设计思路。
电面2:
MIT小白面的,感觉比較寡言少语,面试的时候不怎么说话,就安安静静看我写代码。
第一问:给一个电话号码,而且提供一个字典,要求给出全部与号码相应的单词。这个题目跟LeetCode里的letter Combinations of a Phone Number比較类似。DFS秒掉。简单分析了下时间复杂度。
第二问:假设dropbox这样的单词不在字典里,可是drop和box都在,那么dropbox也算,这样的情况怎么办。
我首先思路是沿袭第一问的方案。在DFS的函数里。除了一个string作为当前的string,多加了一个string參数作为merged string。
思路稍作改动,对于一个字母,有两个选择:1)能够append到当前string上;2)假设当前的string本身是一个合法单词,能够把当前string设置为空字符串,在之后又一次匹配。
第三问:我说第二问的解法可能会产生反复的解。小白就问怎样解决。我说了最简单的方法是用set去装结果,然后说想想其他解法。
之后沿着这样的思路想不下去了,决定换一种思路。思路应该和LeetCode里的Word Break不多。大致就是使用DP或者recursion + memorization。假设整个单词在字典里。就标记下。假设不是。尝试全部的划分方法。把单词划分为2个子单词,再递归下去。说了思路后本来想写的,应该之前做过这样的题目,结果小白预计怕我写代码时间太久。就直接到下个问题了。
第四问:假设给了dict,而不不过给了一个函数接口,能不能换种思路。我想大概是要我从dict出发,枚举出全部组合词,直到组合词的长度超过电话号码长度吧。我实现的时候做了一些剪枝,由于每次寻找下一个单词时,都是须要跟下一块号码子字符串相应的(用到了第一问实现的方法)。假设不正确应,那么就不用继续递归下去了。
第五问:问从字典出发的方法和从号码出发的方法,哪种好。我认为这个问题比較复杂。就说字典小的时候从字典出发有优势。不然就从号码出发。
第六问:我在解题的时候说字典假设能用字典树构造而不是set,那么解法能够被优化。
然后小白就顺藤摸瓜,问假设让我用字典树,怎么写代码。
我写了下,发现要改的地方不少。
一大半都得重写,写了一半。然后小白说时间到了。
除开開始10分钟问简历,后面5分钟让我问下问题,余下45分钟感觉根本不可能把全部的题目都写代码,后面2问事实上也就够时间写下伪代码。
感觉这一面还是非常顺利的,个人认为combination。enumeration一类的题目一般都不难,唯一难的地方是怎样去重。但小白的问题里基本都回避掉了这个难点。