Tag Archives: 趣题

死理性派教你做微软面试题

(本文于2011年8月29日首发于果壳网死理性派主题站

经常能在网上看到各种不知真假,却被转烂了的“超变态但很经典的微软面试题”。那微软这样的大公司,到底有多喜欢“蹂躏”面试者的智商呢?本文就从一套广为流传的的“10个最著名微软面试题”中选取了几个最经典的,来和它们较量较量。

闲话少叙,解题吧。

Continue reading

寻找只出现了2次的数字

在一个存放着数字的数组里,有一个数字出现了2次,其余的都出现了3次,如何找到那个出现了2次的数字?

这是在知乎上看到的一个很有趣的问题。 看到这题我立刻就想到了另一个经典的问题,即在一堆数据里,有一个数字出现了奇数次,其他数据都出现了偶数次,如何找到那个出现了奇数次的数据?一个正常 人的第一反应九成九是哈希,但是事实上这个问题存在一个非常简单、而且时间复杂度非常低的方法,即把所有的数据异或起来,最后的结果就是我们要找的数据。

这个方法乍看也许很玄妙,但其实原理很简单,即两个相同的数异或的结果是0。把所有的数据异或起来,出现了偶数次的数据都在自己和自己异或的过程中湮灭了,于是最后只剩下那个出现了奇数次的数据站在那儿茕茕孑立。

但是如果某个数组里只有一个数出现了为偶数的2次,其余的都出现了为奇数的3次应该怎么办?我一开始囿于成见想了很久怎么用异或来做这件事情,最终 结果是恍然悟出我在做一件多么愚蠢的事情——异或的结果只能让我们想要找的那个数变得如羚羊挂角,无迹可求。想要不借助于哈希这种无聊的办法而得到这题的 答案,必须要使用一种运算让一个数一但出现了3次,就会自我抵消掉。

下面的这个办法不是我想出来的,而是知乎上的一位牛人所给出的。即把所有的数据当作一个3进制数,然后在每一位上,把所有的数据这一位的3进制数加起来,乘以2再对3取模,最后得到的3进制数的值(也就是对应的10进制数)就是我们需要的答案。

这个巧妙算法的原理同样也很简单。一个数字如果出现了3次,那么把3个它加起来一定是3的倍数,即对3取模为0。但是如果一股脑把所有数据加起来再 对3取模,我们只能得到0,1,2三种值,明显离我们的答案存在的可能性相差甚远。所以这个方法又采取了另一个巧妙的思想即把所有数据看作3进制数,然后 在每一位上利用这个原理来处理。这和之前我们提到的那个题目用二进制运算异或有异曲同工之妙。

下面是我用ruby写的一种该算法的实现,具体的实现细节可能和原算法所描述的稍有不同,但主要思想是一致的。

事实上在这个问题上我们还能更进一步地思考,如果一陀数据里只有一个数出现了偶数次,其余的数都出现了奇数次,如何找到那个出现了偶数次的数据?欢迎各位在这里给出你思考的答案。

《如果要我出程设题》官方参考答案

前几天作《如果要我出程设题》,本漫思所启而作,不意众猿兄媛妹抬爱,竟得一时风靡。然原文实乃随笔所作,多有未审之处,网上诸君引经而论,竟见余 之所未见,发余之所未发,实令余既难免汗颜之处,亦多有拜服之叹,故知浩哉华夏,吾道不孤。今撰此参考答案一份,虽以官方之名,终是一家之言,唯送诸此嚣 嚣尘世,以待高士斧正。

题目原文链接:http://liyaos.com/blog/programexam/

一,选择题:

1, ABC皆对。这题只是送分而已,不同的角度看待二进制思想这一名词,自会得出不同的答案。伏羲氏以阴阳两爻和天地人三才创立先天八卦阵,可以看作是 3bit的二进制数,即二进制思想之启蒙;但伏羲氏毕竟是传说中的人物,而后世作后天八卦阵以及推演周易六十四卦的周文王不但在历史上的可信程度大了很 多,而且还把3bit二进制数推广到了6bit,此二进制思想更完善,如果对二进制思想的定义较高,周文王显然是更好的答案;如果要求二进制思想必须是完 整的思想体系的话,那么还是莱布尼茨这位兄台更加准确。柏拉图虽持二元之论,但此与二进制思想相差尤远,故不采。

2, D,指针。“指”为指针,“物”为数据。

3, C,java/javascript。单从表面上可以看出来,题目中两组对应关系都是名字相似却本质毫无联系的事物,因此java和javascript 这组对应关系更加类似。此外这两组对应关系出自一副对联,曰:“蔺相如,司马相如,名相如,实不相如;魏无忌,长孙无忌,彼无忌,此亦无忌”,将此对联与 这一组对应关系相较,岂不暗合!

4, B,分治。破其合纵,远交近攻,收买重臣,分而治之。

5, C,记忆化搜索。用毛线标记出已经走过的路径。

6, A,神经网络。题目里面扯上这个电影主要是想开阔下自己出题的思路。电影里这个机器人了解事物要靠学习,显然是强人工智能,但其学习的过程并不类似遗传算法所应表现出来的,所以神经网络最为接近。

7, D,不会定义自己的需求。A和B显然是以偏概全,问题纠结于C和D两个选项。齐王渴望士,但却不知道自己渴望什么样的士,这更接近于软件工程中客户不会定 义自己的需求的情形;而按照我自己的理解,倘若齐王知道什么是士,却无法讲出来什么是士,这才叫做“不会下定义”。故此题答案为D。

8, C,衍生类未重载。不理解的同学烦请自行查阅“卵有毛”这个命题是怎么推导出来的。

9, A,继承。这个有疑问吗?

10, C,统一接口。张居正改革以前明朝的赋税制度是非常混乱的,其一条鞭法极重要的一点便是将各种杂七杂八的赋税徭役统一了起来,即统一接口。泛型编程在于可以接受各种数据类型,与此不符。

二,匹配题:

A1 – B3(将东西南北逐一穷举);

A2 – B2(关键为“蓦然回首”一句);

A3 – B5(不解释……);

A4 – B1(讥讽南明福王及其府下臣子只知贪图眼前光景);

A5 – B4(将飞鸟的动作拆分成无数部分,则飞鸟的每一刻的影子都是重新生成的,是不动的。其实这题我本来想用“镞矢之疾,有不行不止之时”这一句的,却鬼使神差地写下了这一句)。

三,阅读理解:

1,微软亚洲研究院。

2,斐波那契数列中每一项是前两项之和,是一个单调递增序列,而且越到后面其增长越快,所以搭配了“漫延”这个词语。这象征了我对“你”的思念每一 天都如同和把之前的叠加在一起,这般与日俱增,而终如洪水般“漫延”。亦有人提出斐波那契数列的通项公式是由无理数构成,但每一项却都是有理数,这种因既 无理而果又有理的纠结恰恰很好地诠释了思念之情的意义。我要承认这后面一点我身为作者也未曾想到。

(其实写的时候我并没有想太多,所以文囿同学“其实这就是作者信笔所至之处,比喻虽甚不恰当,到底无伤大雅”的评价还是很正确的……)

3,作者写这句话其实是表达了他对他学的软件工程概论课程的感慨……搞软工的人,你们懂的。

4,过去在哪儿听说算法有不变性这一特征,但是这个说法似乎不太严谨,这里我倾向于采用高德纳(即Donald E. Knuth)的提出的“明确性”(或者说被翻译出的)这一说法。

5,匈牙利算法是二分图匹配算法,对每个点通过寻找可增广路改进的方式得到最大匹配。原文用“牵手”形容匹配,用“画面”一词将算法过程中的某一步匹配定格,这个匹配是否问最终匹配并不重要,重要的只是此刻。

这里顺带贴出杨弋大神的第5题答卷:“匈牙利算法的特点是一旦牵手了就永远有手签,每次增广路经过自己的时候还会换一个。所以该作者喜欢牵手画面其实喜欢的是将来一直有手牵的可能性,与文中的“你”是谁没有关系……”(我对天发誓这不是作者的原意 = =||)

如果要我出程设试题

一,选择题(皆为单选):

1,以下谁是二进制思想的最早提出者?

a,伏羲;b,姬昌;c,莱布尼茨;d,柏拉图。

2,以下哪个概念和公孙龙的《指物论》中的“指”字含义相近?

a,变量;b,数组;c,对象;d,指针。

3,蔺相如,司马相如;魏无忌,长孙无忌。下列哪一组对应关系与此类似?

a,PHP,Python;b,JSP,servlet;c,java,javascript;d,C,C++。

4,秦始皇吞并六国采用了以下哪种算法思想?

a,递归;b,分治;c,迭代;d,模拟。

5,雅典王子忒修斯勇闯克里特岛斩杀米诺牛的时候采用了以下哪种算法?

a,动态规划;b,穷举;c,记忆化搜索;d,Dijkstra算法。

6,印度电影《宝莱坞机器人之恋》中的机器人七弟采用的智能算法最有可能是以下哪一种?

a,神经网络;b,遗传算法;c,模拟退火;d,穷举算法。

7,《公孙龙子》记载:“齐王之谓尹文曰:‘寡人甚好士,以齐国无士,何也?’尹文曰:‘愿闻大王之所谓士者。’齐王无以应。”这说明了齐王:

a,昏庸无道;b,是个结巴;c,不会下定义;d,不会定义自己的需求。

8,惠施曾提出过“卵有毛”的命题,以下哪一项是导致这个错误命题的原因:

a,混淆了命名空间;b,引入了错误的包;c,衍生类未重载;d,调用了危险的指针。

9,下面哪种面向对象的方法可以让你变得富有?

a,继承;b,封装;c,多态;d,抽象。

10,明朝时期张居正改革的一条鞭法的主要思想是:

a,面向过程;b,万物皆数;c,统一接口;d,泛型编程。

二,匹配题(分析A中的句子所体现的算法,和B中的算法一一匹配):

A:

1,江南可采莲,莲叶何田田,鱼戏莲叶间。鱼戏莲叶东,鱼戏莲叶西,鱼戏莲叶南,鱼戏莲叶北。——汉乐府《江南》

2,众里寻他千百度,蓦然回首,那人却在灯火阑珊处。——辛弃疾《青玉案》

3,从前有座山,山里有座庙,庙里有个老和尚,再给小和尚讲故事,故事内容是:从前有座山,山里有座庙,庙里有个老和尚,再给小和尚讲故事,故事内容是:从前有座山,山里有座庙,庙里有个老和尚,再给小和尚讲故事,故事内容是……

4,只劝楼台追后主,不愁弓矢下残唐。——孔尚任《桃花扇》

5,飞鸟之影,未尝动也。——《庄子》

B:

1,贪心;

2,回溯;

3,穷举;

4,分治;

5,递归;

三,阅读理解(阅读下文,回答后面的问题):

爱在程序间

作曲:周杰伦;作词:梦里醉逍遥

美国的贝尔实验室设计了最初的C语言
刻在UNIX操作系统距今已有三四十年
你在屏幕前凝视数据的缱绻
我却在旁轻轻敲打键盘把你的梦想展现
循环 递归 贪心 动规 是谁的从前
喜欢在匈牙利算法中你我牵手的画面
经过MSRA门前我以大牛之名许愿
思念像斐波那契数列般漫延
当软工沦落在设计的文档间
算法依旧是永垂不朽的诗篇
我给你的爱写在程序间
深藏在最长不下降子序列里面
几万组数据流过后发现
我的心依然不变
我给你的爱写在程序间
深藏在最长不下降子序列里面
用无尽的代码刻下了永远
那已保存千年的誓言
一切又重演
我算了很多遍
时间复杂度还是趋于无限
我只想要这样永远链接在你的身边

1,题目中的MSRA是什么的缩写?

2,试赏析“思念像斐波那契数列般漫延”一句。

3,请结合时代背景,谈谈你对“当软工沦落在设计的文档间,算法依旧是永垂不朽的诗篇”一句的理解。

4,“几万组数据流过后发现,我的心依然不变”一句体现了算法的什么特性?

5,就“喜欢在匈牙利算法中你我牵手的画面”一句,谈谈你对匈牙利算法的理解。