狗家10/31Sunnyvale面经

今天刚收到recruiter电话说过了hc,上来发个timeline和面经
Timeline
9/16 Refer
9/27 OA
10/19 Schedule Onsite
10/31 Onsite
11/16 HC

  1. 给你一个chatting log file,format大概是这样的:
    A: bla
    B: bla bla. 1point3acres
    C: bla bla bla. check 1point3acres for more.
    要你找出说话最多(看word number) 的K个人
    而且代码要从读file开始写

  2. 给你n个log file, 里面每一行的格式都是 timestamp: content (timestamp是从小到大排好的)
    现在让你把这n个log file合并成一个大log file(也是要timestamp从小到大排)
    限制条件就是content很大,每个log file也很大 (不能全部读到memory里面)
    这一题你就可以assume一些function存在,比如readTimeStamp,copyContent之类的,只要跟面试官解释清楚这个function的作用就好. check 1point3acres for more.

  3. 一个类似24点的游戏,假设牌桌上有无数张1-10的牌,然后你手上的牌的总和是k,现在你可以随机到牌桌上抽牌加到总和里,如果你手上牌的总和在20-25之间就是win,如果总和超过25就是lose,现在让你求lose的概率。
    这一题我好像在地里见到过但是当时那个楼主说他没有做出来,所以我就也附上一下我的大概解法。
    首先因为每张牌都是无数张,所以抽任何一张牌的概率都是0.1。然后就是要考虑到有很多重复的情况,所以用dp或者recursion with memoization其实都可以。
    我是用dp做的,从后往前推,所有的结束可能就是20 - 29 其中P(20)到P(25)= 0, P(26)到P(29) = 1。那么P(19) = 0.1P(20) + 0.1P(21)+… 以此类推,最后算到P(k)
    followup:假设每张牌是n张
    这就比较麻烦了,因为抽牌的概率跟当前牌桌上每张牌的数量有关,所以用dp比较难做,我就改用recursion with memoization。不仅要存手上牌的总和还要存牌桌上每张牌的数量。

  4. 给你一串input,比如:
    A -> B
    B -> C
    X -> Y
    Z -> X



    然后让你设计一个data structure来存这些关系,最后读完了以后呢要输出这些关系链:[A -> B -> C, Z -> X -> Y]
    如果遇到invalid的case就直接raise error,比如你已经有了A->B->C,这时候给你一个D->C或者B->D就是invalid的。
    followup我感觉就是他看你什么case没有cover就提出来然后问你怎么改你的代码和data structure
    比如遇到A->B两次,再比如遇到环
    这题相当开放,面试官说他遇到过4,5种不同的解法,总之就是最好保证insert是O(1), reconstruct是O(n)

最后祝大家都能有好消息!

补充内容 (2018-11-19 01:02):
第四题好像说是关系链有点误导大家,它题目的意思更像是directed graph,然后每次读进来的都是一条edge,要求是你的graph里只能有链条,不能有branch,不能有cycle,所以假设你有A->B->C,这时候又来了一个A->C算错

楼主OA玩能直接约onsite得嘛

请问下第4题楼主用的什么数据结构

楼主,第四题可能出现A -> B/C/V 之类的情况吗?

嗯,我不知道他们是怎么定要不要phone的,我周边的朋友直接去onsite和先一轮phone的都有

可能出现,那你在读到A->C的时候就要raise error。总之就是只能是一条链,不能有branch

我是用的hashmap + double linked list

楼主这个第二题,因为有“限制条件就是content很大,每个log file也很大 (不能全部读到memory里面)”,这个题是什么思路呀?谢谢

就是merge k sorted list的pq解法吧
不能全读到memory的约束是不让合并之后对全体排序

请问lz这是level几的