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

与二进制有关的几道面试题

2012-05-27 16:09 411 查看


这个是在博客园的博问里面看到的

1、现有1000个苹果,10个盒子,现在要你将1000个苹果装入10个盒子中,使得用户无论购买多少个苹果(1-1000),都能由若干个盒子拼装而成(卖的时候是整个盒子卖,不能拆盒子的包装)
解法:考虑1, 2, 4, 8这四个数,由这四个数可以组成1-15之间任意一个数,也即1,2, 4 ... 2n 可以组成1-2(n+1)-1之间所有的数。所以这十个盒子分别放入
1, 2, 4, 8, 16, 32, 64, 128, 256, 489个苹果,即可组成1-1000内所有的数。
 
2. 有1000瓶液体,无色无味,外表完全一样,其中一瓶是毒药,有10条警犬,警犬喝过毒药后两小时后死亡。问,如何在两个小时后确定哪瓶是毒药。
也是二进制方法,1000瓶毒药编号0-999,10条警犬编号0-9,现在看每瓶液体编号的二进制表示,假设第i(从0开始)位是1,那么让第i条狗喝这瓶液体。比如第0瓶液体,没有警犬喝,第5瓶液体分别由第0条和第2条警犬喝,将1000液体全部分配给警犬喝下。待两个小时后,查看所有死亡的警犬,将它们的编号组成二进制数,那么这个二进制数对应的十进制数即是液体的编号。

作者:zdd
出处:http://www.cnblogs.com/graphics/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.

拓展阅读:http://hi.baidu.com/lgong/item/2b93b3c8b85b49d2974452fa

有 1000 个一模一样的瓶子,其中有 999 瓶是普通的水,有一瓶是毒药。任何喝下毒药的生物都会在一星期之后死亡。现在,你只有 10 只小白鼠和一星期的时间,如何检验出哪个瓶子里有毒药?

提示:使用伟大的二进制



从1000个瓶子跟10个老鼠这里直觉就是会跟2的10次方有关系

也学是学计算机的对二进制比较熟悉吧

联想到要用10这个数字来构造1000种可能而 2的10次方=1024>1000

而且每条老鼠的结果就两种可能被毒死而没被毒死

这个问题就把十个老鼠当作十个二进制的位,十位二进制能表示的数字个数是1024个,所以即使瓶子数量是1024也是可以找出来结果的,具体办法就是把一千个瓶子标上序号(先拿出来一瓶,剩下的瓶子从1开始编号),假设 是编号为n的有毒 比如n是 512那么 写成二进制就是1000000000,现在让你找这个序号是多少,相当于让你确定这个十位的二进制数每一位的数字是什么(此时你并不知道是512),so 我们先来确定第一位,我们使用正向确定法,就是确定这位是不是1(反向推测就是确定这位是不是0),怎么确定呢,我们先找到这一位是1的所有的数值,然后把这些数值对应的瓶子里面的液体取出来混合,(此时一就是512一直到99)让第一个老鼠喝掉,然后第二位,第三位.....依次类推到最后一位。最后十个老鼠都喝了瓶子的液体,一周后,哪个老鼠死了那一位就是1,得到一个十位的二进制数字,转换成十进制就搞定了,比如我们之前举的例子是编号512这瓶,那么肯定就是只有第一个老鼠死了,得到结果是1000000000

(如果任何老鼠都没有死即结果是0000000000 ,就是说明我们拿出来的那瓶是毒药)

讨论后续

引用:最初由釜森发布 是楼主没有把话讲明白,根据我的理解,这样讲,可能更容易明白:

1.把1-3号小白鼠的排列看成一个2进制记数器,活着代表0,死了代表1(这里是一个3位数的2进制记数器);

2.先假设这个2进制记数从001开始记数,每增加一个记数,把这个2进制记数器所对应的十进制数,填入到记数位上凡显示有1的下面的...

直观来说是这样,不过我只不过是先安装自己的做这道题目的时候的思路来写罢了

就好像老师教学生一样,大部分老师总是教给学生这个问题这样可以解决

但是并没有告诉我们为什么这样能解决

为什么第一个做出这道题目的人是怎么想出来的

总不可能一下子就知道这样就能做出来来了

总得有个思路过程吧是吧

所以授人以鱼不如授人以渔

让别人看到你的思路过程,才能有进步
引用:最初由xujintian发布 既然只要2^10=1024种老鼠状态中的1000种无冗余的代表1000种瓶子的可能结果(一一对应),检验方法肯定不是唯一的。

那么共有多少种检验方法?

????????????????????????????????????????????

使用的是二进制 二进制每一位就两种可能

0 或者 1

虽然说有毒的瓶子的编号知道之前是有1000中可能的

但是二进制的表示方式就两种可能要么正常的1 就代表 1

要么反向的 0 代表 1 看起来是十位但是十位肯定使用的是同样的表示方式了

所以冗余并不能被利用

也就无法扩展其他的表示方式

比如 你想使用冗余的输出可能

假设你想使用 是 1111111111 =1023 这个结果

那么 按照之前我说的 1111111111 要么表示 1111111111

要么表示0000000000

因为在你结果的十位二进制数中0代表 1 还是代表0 必须是固定的

不能你的十位二进制数中 第一位代表0 第二位又代表1去了

除非你的瓶子数低于1024的一半

那你就能使用相反的表示方式了

浏览(1262)评论转载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  面试 生物 联想 扩展 c