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