又到校园招聘的季节了, 自从和一些同事出版了《编程之美》一书之后, 我经常收到一些关于面试, 编程, 和“题库”的询问。 其实我自己对算法没有什么研究, 有些问题都答不上, 研究院最近搬了一次家, 原来的 “题库”也不知道搬到那一层楼去了。 不过, 常在河边走, 哪能不湿鞋? 在微软亚洲研究院这个水很深的地方混, 一些题目还是打湿了我的脚。 今天新的校园招聘 正式开始了, 我准备了几个比较容易的题目, 作为 “献礼”。这些题目不是一上来就刷刷刷写代码的那种, 我自己都不知道最佳解法是什么, 如果你有好的想法, 可以讨论一下.
1. 只考数据结构的题目
不少同学觉得《编程之美》上面的题目太难了, 还要写那么多程序… 好, 其实也有很简单的问题, 例如这一个 - 只考数据结构的知识:
《编程之美》 中提到 “求数组最大子数组的和”这一题目,
脑快手快的同学写一个 10 行的程序就把这个问题搞定了。
我们还把这个问题扩展到二维, 例如:
我还问过一些同学, 如果数组首尾相连, 像一个轮胎一样, 又怎么办呢? 这些同学也给出了漂亮的答案, 并且用 SilverLight/WPF 给画了出来:
好,设想我们有一张纸带,两面都写满了像 [图2] 那样的数字, 我们把纸带的一端扭转, 和另一端接起来, 构成一个莫比乌斯环 (Möbius Strip).
我想尽管这个纸带扭了一下, 但是上面还是有数组, 还是有最大子数组的和, 对么? 在求最大子数组的和之前, 我们用什么样的数据结构来表示这些数字呢? 你可以用 Java, C, C#, 或其他语言的数据结构来描述这个莫比乌斯环上的数组。数据结构搞好了, 算法自然就有了。
2. 举一反一的问题
《编程之美》的第一题是让Windows 任务管理器的CPU 使用率曲线画出一个正弦波。我一直在想, 能不能把CPU 使用率边上的网络使用率也如法炮制一下呢? 比如, 也来一个正弦曲线?
3. 人月的问题
如果你没看过, 也至少听说<人月神话> (The Mythical Man-month) 这本在软件工程领域很有影响的书. 当你在微软学术搜索中输入 “manmonth” 这个词的时候, 你会意外地碰到下面这个错误:
经过几次试验之后, 你发现必须要输入 “man-month” 才能得到希望的结果。 这不就是只差一个 ‘-’ 符号么? 为什么这个搜索引擎不能做得聪明一些, 给一些提示 (Query Suggestion)? 或者自动把用户想搜的结果展现出来 (Query Alteration)? 我们在输入比较长的英文单词的时候, 也难免会敲错一两个字母, 网站应该帮助用户, 而不是冷冰冰地拒绝用户啊。
微软的学术搜索 (Microsoft Academic Search) 索引了超过 3千万的文献, 2 千万的人名, 怎么能以比较小的代价, 对经常出现的输入错误提供提示? 或直接显示相关结果, 避免用户反复尝试输入的烦恼?
你可能会说, 这很难吧, 但是另一家搜索引擎似乎轻易地解决了这个问题 (例子)。 所以, 还是有办法的。
这个题目要求你:
1) 试验不同的输入, 反推出目前微软的学术搜索是如何实现搜索建议 (Query Suggestion)的。
2) 提出自己的改进建议, 并论证这个解决方案在千万级数据规模上能达到 “足够好” 的时间 (speed) 和空间 (memory usage)效率。
3) 估计这事需要几个 人·月 (man-month) 才能做完?
----
有人问, 把题目都公开出去, 大家都知道答案了, 我们还怎么面试啊?
回答: 这就看面试官的功夫了.
三个题目都做好的应届毕业生, 请直接找我。