第一面:
要求介绍K-means算法,并给出找起始点的策略。
开放性问题:给用户推荐一定距离内他可能去的餐馆,请给出算法策略。我想的是已知距离和餐馆的访问次数,套用TF-IDF模型。
写代码:两个字符串,判断一个字符串是否是另一个字符串的子串,并返回子串的起始位置。
第二面:
什么样的数据结构可以满足多次插入删除,取最小数,给出时间复杂度。我的回答是小顶堆,建立小顶堆的时间复杂度是O(nlogn),之后每次插入删除的时间复杂度是O(logn)。
写代码:链表逆序。(练了很多遍,写得非常顺利)
开放性问题:已知每天的呼叫订单,在线司机,和成交订单记录,如何判断异常数据。我的回答是用卷积函数来检测异常。(实际可能他们真会用到卷积)看到我做过图像处理就问了我傅里叶变换,我说我不记得了。。。
描述Dijkstra最短路径算法。(去滴滴面试之前专门复习了这个算法,讲得很顺利)
问题:
问了一个超有意思的智力题:
100个人排队,每个人只能看到自己之前的人的帽子的颜色(假设只有黑白两色),每个人都得猜自己帽子的颜色,只能说一次,说错就死掉,别人可以听到之前的人的答案以及是否死掉。请问用什么策略说死掉的人最少。
回答:
我的回答是看哪个颜色的多就说哪个颜色。后来就想不出来了。
接着面试官简单介绍了一下他们目前的工作。然后问我有没有问题问他。然后我恳求他告诉我这道题的答案。他说了他的策略。
假设只有3个人,假设ture = 白,false = 黑,用这个公式x3 = (x1 == x2),用人话就是1和2的帽子颜色一样的话就说白,不一样的话就说黑。这个策略第一个人死的概率是1/2,剩下的两个都不会死。
他让我推广到4个人,也就是x4 = (x3 == (x1 == x2)),照理可以推广到100人。但问题就是人很难判断,只能靠计算机来算。
网友提供了一个解题方法:“最后一个人看一下前面黑帽子的个数是奇数还是偶数,比如约定奇数说黑,偶数说白。这样前面的人都可以推断出来正确的结果。”
满意的地方:
不满意的地方: