校园招聘 - 比较容易的面试题
又到校园招聘的季节了, 自从和一些同事出版了《编程之美》一书之后, 我经常收到一些关于面试, 编程, 和“题库”的询问。 其实我自己对算法没有什么研究, 有些问题都答不上, 研究院最近搬了一次家, 原来的 “题库”也不知道搬到那一层楼去了。 不过, 常在河边走, 哪能不湿鞋? 在微软亚洲研究院这个水很深的地方混, 一些题目还是打湿了我的脚。 今天新的校园招聘 正式开始了, 我准备了几个比较容易的题目, 作为 “献礼”。这些题目不是一上来就刷刷刷写代码的那种, 我自己都不知道最佳解法是什么, 如果你有好的想法, 可以讨论一下.
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) 才能做完?
----
有人问, 把题目都公开出去, 大家都知道答案了, 我们还怎么面试啊?
回答: 这就看面试官的功夫了.
三个题目都做好的应届毕业生, 请直接找我。