Google kirkland onsite过经

general hire. 题目比较general,感觉算法没有我5年前面google的时候难,也没有unicorn startup的要求高,只要和面试官打成一片,聊得开心就行了~
第一轮,算法,第一题,split linked list to odd and event linked list. 第二题,binary tree zigzag traversal
第二轮,behavior,问简历经历和工作经历
第三轮,午饭
第四轮,算法,LC remove invalid parenthesis, 一个中国小哥面我的,挺给力的,不断给hints放水。不要求用dp,能做出来和优化就行.
第五轮,算法,第一题,实现一个CPU thread pool, 问的人是GCP api team的,可能是他最近碰到了吧,哈哈。 CPU thread pool 就是实现一个 thread-safe 的producer consumer 模型。简单来说,就是用了一个queue来放task,一个dead loop不断从queue里拿task,然后dispatch给worker thread来run task。网上有很多例子,我就懒得贴代码了. 主要考察是线程安全。要处理几种情况:
1)如果没有task时候,treads要sleep;当此时又有新task了,要notify threads。wake up threads的时候,要handle thundering herd 的情况。这里我用了cpp mutex去做,但更好的应该是用semaphore,但cpp std没有semaphore的implementation.
2)task 装满了queue,怎么办
3) 机器要shutdown了,怎样handle remaining tasks in queue
可以参考Folly CPUThreadPool.

楼主在fb做过infra,所以用过这个library
第二题,number of island, 但不能用dfs,bfs,union find也不能用。要求用着色法,扫两遍矩阵,从左上往右下iterate。
第一遍着色,maintain一个counter 代表总共多少陆地,每块陆地用一种颜色(integer)表示。对每个cell:
1)若左边和上面都是0,当前cell是一块新陆地的第一个cell,counter++
2)如果左边和上面是有颜色的且颜色相同,就把当前的cell也渲染成该颜色。
3)如果颜色不同,则counter–,且标记两种颜色是interchangeable的,相当与disjoint set的union 操作
第二遍,再把contiguous conflict的颜色merge一下。如果是只求number的话,这部可有可无
第六轮,system design。设计一个google driver/dropbox. google drive system design的题目就太大了,完全看面试官的心情想往哪方面问~你是new grad或junior engineer的话不用担心,Google L3,L4都不考system design,只考算法