您的位置:首页 > 职场人生

微软面试题

2013-05-04 10:17 204 查看
这是我认为今年微软面试题中最有意思的一道,这道题很考验一个人的思维,但我们看到答案时,我们就能感到这道题解题的巧妙。故将解题思路分享出来,顺便谈谈我的看法,以下是对于这道题的分析 :

原题:

1000瓶水中有一瓶是有毒的,老鼠喝任意量的毒水都会在一周后死亡,问一周内至少用多少只老鼠可以测出哪瓶水是有毒的?

分析:

这道题目很短,但是我们却很难有一个解题的切入点,但我们都习惯十进制,这样我们都陷入了一种惯性思维中,很难想出这道题跟二进制数之间的渊源。试想一下,如果我们把每个瓶子的编号都化成二进制数的话,我们至多需要10bit的数来表示这些编号(2的10次方=1024>1000)。要确定含有毒水瓶的编号,我们只需要确定那个10bit的二进制数的每一位的0、1取值。只有确定了每一位的取值。那么我们就能得到我们的答案。那么我们选取10只老鼠,每只老鼠对应10bit中的一位。然后,让每只老鼠喝下对应bit位为1的瓶子编号的水。如果该老鼠死,那没则说明,含有毒水瓶子的编号的二进制数在该bit上对应为1;否则,对应为0;

解到这里,你会发现这道题思路十分的精妙。但是我们可以进一步发散我们的思维,比如如果给你两周需要多少只,假如是N周呢?呵呵,这时候我们是否能从之前的解题思路中得到启发呢?假设给你两周,那么我们将会有两轮测试机会,那么我们可以将瓶子编号化成3进制数,刚好,经过两轮测试是可以确定每一位的值,这样我们可以进一步推广到N周的情况。假设我们需要的老鼠数是x,那么我们可以列出方程





通过求对数我们便可以解出x,由一般到推广,这个题还是很有启发性的。

本文出自 “大工软院的技术生活” 博客,请务必保留此出处http://webcrawler.blog.51cto.com/3663163/1192759
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: