狗家昂赛过经

10月下旬面的狗家,已拿到offer,之前在地里看了不少帖子受益匪浅,也发一贴面筋回馈地里。
题都不太难,准备了一堆Trie, SegmentTree, DP 什么的都没用上。。

第一轮,白人小哥,上来就说自己是第一次面试,感觉比我还紧张 出了一道高频自行车匹配,先问一个人怎么找到最近的车,然后扩展到很多人很多车的情况。

第二轮,白人大哥,给一个doublelinked list的pointers的set,问这些pointers可以组成几个connected components. 这题我开始理解错了。。以为是要我求最长的connected component的长度(教训,一定要再三确认题目的意思!!)写了code之后才发现理解不对,赶紧又重新想了一下。说了下可以用并查集来做的思路,但没时间写代码了。这轮估计评价不行

第三轮,国人小哥,非常nice,上来就说中文。题目是对一个树的nodes进行delegate,结果可以是真或者假,如果为假就要删除这个node,最后返回一个set,里面是delegate之后剩下的树的root node.

午饭,白人小哥,带我去吃了"烤鸭",虽然味道一言难尽。。。 尬聊了很多狗家的经历

第四轮,俄国口音小哥,假设已经有一个decode function,可以按如下规则decode: 数字+x+char = 重复这么多数字的char
e.g. 5xy -> yyyyy, 10xabc -> aaaaaaaaaabc
写一个encode function,把string encode成这种结构,可以做到decode(encode(string)) == string,encode之后的string应该尽量短

我就先说了下像aa这样的变成2xa会更长,所以只要对重复三次或以上的char做压缩就好。写完了代码之后,小哥说,有些corner cases你没有cover,我反应过来是对于原先就已经是"6xa"这样的string,encode不能正确处理。于是又讨论了一下,说可以把这种情况变成"1x6xa"。

第五轮,白人老哥,进公司十年多了。先问了一题,怎么把一个vector<string> encode写到一个file里,再从file里decode出来恢复成原来的vector<string>。
然后第二题,banana <-> cololo,怎么判断两个string有这种相似的结构。写了之后,follow up是如果有一个很大的词典,怎么快速判断一个词是不是和词典里的某个词相似。

全程没碰到一个烙印,也是很神奇了。我觉得狗家还是很注重思路的,不管是不是刷过题,一定要能展现整个思考的过程。不然就算直接秒了,评价也不会很高。

第一题 老哥follow up怎么答的 真心求教

是个基本的follow up,没有tie的情况,所以我就用一个pq来全局存了每个人到每个车的距离,然后碰到已经拿过车的人就跳过。不是什么特别好的解法,反正小哥表示OK。全程不停交流和展现思维过程可能更重要。

第四轮楼主怎么做的?感觉很复杂啊

请问第三轮是用BFS吗?

不复杂,只是描述比较长。。
就是对于像"aaaabbcccd"这样的string, encode之后应该是"4xabb3xcd"这样。
然后corner case是处理"6xa"这样已经是encode之后形式的string, 需要把每个单个数字都encode成为"1x6"这样的格式就好了。

我用Recursive的办法做的,然后根据左右child结点返回值是true还是false来决定怎么更新当前node的left和right。
我当时先想用BFS但发现比较难处理各种情况,所以放弃了。

谢谢楼主,如果原字符串是数字比如 123456666,那是不是要变成 1x11x21x31x41x54x6?

补充内容 (2018-11-11 12:08):
回复楼主的:
不复杂,只是描述比较长。。
就是对于像"aaaabbcccd"这样的string, encode之后应该是"4xabb3xcd"这样。. Waral 博客有更多文章,
然后corner case是处理"6xa"这样已经是encode之后形式的string, 需要…

嗯,理论上是这样的。。当然其实这种情况下直接不做转换更好。对于corner cases,我当时讨论了一下各种情况,说了下大概思路,没要求写代码。

嗯,我上面的例子有点极端了,不需转换。但是对比如34666666666666666666, 理论上转换成1x31x420x6更短