今天被问到一个问题:15个瓶子里有一个有毒,你有四只老鼠,老鼠喝了有毒的水,第二天会死。请问怎样才能在第二天就知道哪个瓶子有毒?
面试碰到这类问题其实关键不在于答案,而在于思路,这也正是面试官在有限时间里想看到的东西。
说下我的思路:
拿到这个问题我第一时间想到的是二分查找。
巧的是,16正好是2的4次方,也就意味着,这题的出题多半就是一个查找问题。好,那么怎么样把解决方案细化下去呢。
首先是二分,把15瓶分成1-7 和8-15两部分
第一只老鼠(甲鼠)的使命就是喝下其中一部分全部的水,这样根据他死亡情况,可以把结果区间进行二分。
同样的思路,第二只老鼠(乙鼠)要对剩下的结果进行二分,但我们可以充分利用他,让他同时喝下1-4以及8-12的水,因为我们可以结合第一只老鼠的死亡情况,来将结果定位到四分区间内。
以此类推,第三只老鼠(丙鼠)喝下编号为1-2,5-6,9-10,13-14的水。
最后一只老鼠(丁鼠)喝下编号为1,3,5,7,9,11,13的水。
此时,我们已经可以通过老鼠的死亡状况,来推测出15个瓶子中有毒瓶子的序号了。
同时这也就推导出了一张二进制编码表。
结论
至此,这个问题就解决了。
当你把这张表交给面试官时,收获的一定是一个肯定的眼神。