起因

最近离职了,可以一整天的在技术群里吹水了。
然后在群里看到有人拿题出来,就试着做了一下。

经过

我看到题的第一个想法是每个老鼠喝两桶找到重叠被毒死的老鼠例如第一只老鼠喝1,2第二只喝2,3。如果2有毒那么就是第二只被毒死。
然后我洗澡的时候突然想起之前看李永乐老师的一个视屏。多个集合中不同的数字。让学生随意想一个数。然后是否包含在集合中快速的得出结果。用了二进制来做。我思考了一下这个解决方案完美适用。

大致思路


被毒死的填1存活的为0。这样就可以得到被存在毒药序号的二进制数。然后转成10进制就可以得到。这种算法只需要和二进制长度相同的老鼠就可以找到那一桶为毒药。
1000的二进制数为1111101000 那么需要十只老鼠就可以找到那一桶存在毒药。


import java.util.ArrayList;
import java.util.List;public class Demo01 {// 定义出1000桶水private static final List<Integer> ALL_LIST = new ArrayList<>(1000);// 那一桶是有毒的,懒得写随机数了,这里随意指定一个private static final int a = 677;// 每一只老鼠各自需要试的水private static final List<Integer> MOUSE_1 = new ArrayList<>();private static final List<Integer> MOUSE_2 = new ArrayList<>();private static final List<Integer> MOUSE_3 = new ArrayList<>();private static final List<Integer> MOUSE_4 = new ArrayList<>();private static final List<Integer> MOUSE_5 = new ArrayList<>();private static final List<Integer> MOUSE_6 = new ArrayList<>();private static final List<Integer> MOUSE_7 = new ArrayList<>();private static final List<Integer> MOUSE_8 = new ArrayList<>();private static final List<Integer> MOUSE_9 = new ArrayList<>();private static final List<Integer> MOUSE_10 = new ArrayList<>();// 定义位数,用于计算哪一位为 1private static final int BINARY_1 = 1;private static final int BINARY_2 = 1 << 1;private static final int BINARY_3 = 1 << 2;private static final int BINARY_4 = 1 << 3;private static final int BINARY_5 = 1 << 4;private static final int BINARY_6 = 1 << 5;private static final int BINARY_7 = 1 << 6;private static final int BINARY_8 = 1 << 7;private static final int BINARY_9 = 1 << 8;private static final int BINARY_10 = 1 << 9;public static void main(String[] args) {init();show();}public static void show() {StringBuilder sb = new StringBuilder();sb.append(MOUSE_1.contains(a) ? "1" : "0");sb.append(MOUSE_2.contains(a) ? "1" : "0");sb.append(MOUSE_3.contains(a) ? "1" : "0");sb.append(MOUSE_4.contains(a) ? "1" : "0");sb.append(MOUSE_5.contains(a) ? "1" : "0");sb.append(MOUSE_6.contains(a) ? "1" : "0");sb.append(MOUSE_7.contains(a) ? "1" : "0");sb.append(MOUSE_8.contains(a) ? "1" : "0");sb.append(MOUSE_9.contains(a) ? "1" : "0");sb.append(MOUSE_10.contains(a) ? "1" : "0");System.out.println(sb.reverse());}// 初始化数组public static void init() {for (int i = 1; i < 1001; i++) {ALL_LIST.add(i);if ((i & BINARY_1) == BINARY_1) {MOUSE_1.add(i);}if ((i & BINARY_2) == BINARY_2) {MOUSE_2.add(i);}if ((i & BINARY_3) == BINARY_3) {MOUSE_3.add(i);}if ((i & BINARY_4) == BINARY_4) {MOUSE_4.add(i);}if ((i & BINARY_5) == BINARY_5) {MOUSE_5.add(i);}if ((i & BINARY_6) == BINARY_6) {MOUSE_6.add(i);}if ((i & BINARY_7) == BINARY_7) {MOUSE_7.add(i);}if ((i & BINARY_8) == BINARY_8) {MOUSE_8.add(i);}if ((i & BINARY_9) == BINARY_9) {MOUSE_9.add(i);}if ((i & BINARY_10) == BINARY_10) {MOUSE_10.add(i);}}}
}


这样就可以实现10只老鼠找到一千桶水中那一桶水有毒。前提是老鼠不会被撑死。。。。

一千桶水中找出一桶有毒的水相关推荐

  1. 算法,16瓶水,有一瓶有毒,假设一只小白鼠喝一滴水,一个小时后会死亡,一个小时找出那瓶有毒的水至少需要几只小白鼠?

    首先16瓶水,编号0000,0001-1110,1111.然后让第一只小白鼠喝最低位为1的水,第二只小白鼠喝次最低位为1的水,第三只小白鼠喝第三位为1的水,第四只小白鼠喝最高位为1的水.一个小时后看小 ...

  2. 有1000桶酒,其中1桶有毒.而一旦吃了,毒性会在1周后发作.现在我们用小老鼠做实验,要在1周内找出那桶毒酒,问最少需要多少老鼠.

    有1000桶酒,其中1桶有毒.而一旦吃了,毒性会在1周后发作.现在我们用小老鼠做实验,要在1周内找出那桶毒酒,问最少需要多少老鼠. 很老的笔试题了. 答案是10只. 把十只老鼠看成二进制的位数,把酒桶 ...

  3. 10杯水只有一滴有毒,用四只老鼠测试,二进制的方法快速找出哪瓶有毒;

    10杯水只有一滴有毒,用四只老鼠测试,二进制的方法快速找出哪瓶有毒: 分析,杯子1-10用二进制分别表示为 第一杯: 0000001 第二杯: 0000010 第三杯: 0000011 第四杯: 00 ...

  4. 1000瓶无色无味的药水,其中有一瓶毒药,10只小白鼠拿过来做实验。喝了无毒的药水第二天没事儿,喝了有毒的药水后第二天会死亡。如何在一天之内(第二天)找出这瓶有毒的药水?

    题目:1000 瓶无色无味的药水,其中有一瓶毒药,10只小白鼠拿过来做实验.喝了无毒的药水第二天没事儿,喝了有毒的药水后第二天会死亡.如何在一天之内(第二天)找出这瓶有毒的药水? 第一次看这个问题完全 ...

  5. 题目:1000 瓶无色无味的药水,其中有一瓶毒药,10只小白鼠拿过来做实验。喝了无毒的药水第二天没事儿,喝了有毒的药水后第二天会死亡。如何在一天之内(第二天)找出这瓶有毒的药水?

    题目:1000 瓶无色无味的药水,其中有一瓶毒药,10只小白鼠拿过来做实验.喝了无毒的药水第二天没事儿,喝了有毒的药水后第二天会死亡.如何在一天之内(第二天)找出这瓶有毒的药水? 第一次看这个问题完全 ...

  6. 1000桶酒中寻找一桶毒酒算法

    有1000桶酒,其中1桶有毒.而一旦吃了,毒性会在1周后发作. 现在我们用小老鼠做实验,要在1周后找出那桶毒酒,问最少需要多少老鼠, 如何检测(老鼠的使用量越少越好,注意,毒性1周后才会发作,而且一周 ...

  7. 【逻辑】500桶酒,其中1桶是毒酒,找毒酒

    题目 500桶酒,其中1桶是毒酒:48小时后要举行酒会:毒酒喝下去会在之后的第23-24小时内毒死人:国王决定用囚犯来试酒,不介意囚犯死多少,只要求用最少的囚犯来测试出哪一桶是毒酒,问需要最少需要多少 ...

  8. 一个文件,内含一千万行字符串,每个字符串在1K以内,要求找出所有相反的串对

    一个文件,内含一千万行字符串,每个字符串在1K以内,要求找出所有相反的串对,如abc和cba. 当时怎么想的忘记了,现在重新思考一下,文件的大小上限是10G,不可能在内存操作了.考虑设计一种hash使 ...

  9. 一千瓶酒有一瓶酒有毒药,问你最少用多少只老鼠可以找出那瓶毒酒? 老鼠毒发的时间在两小时内,要求在两个小时内找出毒酒。

    题目: 一千瓶酒有一瓶酒有毒药,问你最少用多少只老鼠可以找出那瓶毒酒? 老鼠毒发的时间在两小时内,要求在两个小时内找出毒酒. public class Demo03 { public static v ...

最新文章

  1. 每日一皮:你不看我的接口文档就乱调的吗?
  2. linux内核之accept实现
  3. 计算机科学导论第二章,补基础:自学:计算机科学导论 第二章 数字系统
  4. android socket io和服务器_Java socket通讯服务器和客户端教学版
  5. 枚举类型用法_Mybatis-plus常见用法总结三
  6. C#中的Invoke和BeginInvoke
  7. “对比Excel”系列再添新成员,手把手教你用Python实现报表自动化!
  8. [CF1149C](Tree Generator)
  9. wps打开pdf乱码_wps打开pdf乱码
  10. 浪潮java面经总结
  11. 大时代背景下商业地产的数十年转型发展之路
  12. win7网络适配器_win7网络重置
  13. 【loj2567】【APIO2016】划艇
  14. MER 音乐情感识别-论文笔记8
  15. Logstash 中type 和 tags
  16. pip 使用国内阿里云软件源
  17. 沙加在沙罗双树下临死前的一段对白
  18. 医生一句话,6岁女娃的视力从0.15回到1.0!
  19. 重温与解析《最后生还者》的互动叙事精髓(下)
  20. IDC时评:从巴黎圣母院大火看数据中心运维

热门文章

  1. 基于javaWeb的航空机票预订系统
  2. 说说wechat桌面版的“只传输文件”功能
  3. 使用GraphInsight打造TuGraph可视化分析应用
  4. UNIX下执行文件的减肥工具strip
  5. arm-linux-strip是减肥工具而不是压缩工具
  6. PHP**数据类型**
  7. IntelliJ IDEA 创建 hello world Java web Maven项目从头到尾都有图有真相2017版本
  8. 诺基亚S60手机c盘、d盘、e盘、z盘的作用
  9. Google 将停止使用 Oracle 财务软件,转而使用 SAP
  10. 【SpringBoot】SPI 与 spring.factories