与二进制有关的几道面试题
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)评论转载
相关文章推荐
- 与二进制有关的几道面试题
- 几道经典的有关整数二进制的编程题(如:一个数二进制位的偶数位和奇数位交换)
- 有关Java的几道面试题
- 剑指offer面试题10:二进制中1的个数(与位运算有关)
- 剑指offer 面试题10 二进制中1的个数
- 腾讯几道面试题
- 剑指offer面试题10:二进制中1的个数
- n位二进制中1和0的有关问题
- 华为的几道面试题,有点参考价值
- 黑马程序员_有关构造方法的一道面试题
- 剑指offer 面试题10 二进制中 1 的个数
- 关于JVM的几道面试题
- 重解几道华为经典C语言面试题
- 两个与位运算有关的小问题【面试题】
- 关于数组的几道面试题
- 24. 微软面试题:整数的二进制表示中1的个数
- 与全局变量构造析构顺序有关的一道面试题(C++)
- 几道面试题
- 有关TCP三次握手和四次挥手常见面试题
- 几道面试题的解答,肯定有错,欢迎来挑