Mengdong的技术博客

学习,记录,分享

导航

微软实习电面(一)

这次电面是Live Meeting+电话(为什么不用Live Meeting里的语音功能?)

1. 现在有一个无序序列,如何取得最小的n个数(无需有序输出)?

1/ 最简单的,可以用排序,然后就问怎么排序,我回答快排,于是让我实现快排(汗,不让用STL,要写native代码),于是习惯std::sort和std::qsort的我泪奔了。

速度写出快排函数(估计bug若干)。算过关吗?

2/ 让我改进一下,记得《编程之美》里有个类似的问题(见2.5节),于是把快排改进了一下,搞了一个划分预处理。

继续code. 挣扎着在原来的快排上改出来了,估计bug更多。

对面好像没看懂我的思路(也怪我函数命名有问题),于是解释了一下划分的方法。

3/ 继续改进,问能不能通过迭代的方法划分出刚刚好n个元素输出(因为快排的划分中左/右)?

这个没做出来就说PASS了,下一题。

其实用堆做才是最给力的。

2. 现在有一个数据文件,里面是key-value(key不重复,value为变长block),共1M对,数据文件大小4G左右,如何对其按照key进行排序?

就答了个外排序,先划分文件,然后文件内用内排序,文件间归并(外排),没让code,也没深入问。

面完后问对方具体做什么,大概是新闻搜索中新闻聚合一类的工作。

然后问面试表现,对方表示不能讲(是不是不该问这个)。

最后请求他们一定给反馈(不管是accept还是reject),得到肯定答复后结束。

教训:不仅要熟悉高抽象层次的算法(分治、动规、贪心等),还要对基础的算法/数据结构(线性表/树/堆/图/排序/查找等)有熟悉、牢固的掌握,只会调调std::sort之类是远远不够的。

posted on 2011-05-05 16:17  mdyang  阅读(1198)  评论(0编辑  收藏  举报