1000瓶药,至多1瓶有毒,用10条狗(老鼠)试毒的面试题

  1. /**
  2.  * 题目:1000瓶毒药至多有一瓶有毒,10条狗用于试毒,狗在服药20小时后会出现中毒症状,
  3.  * 你有24小时得出结论:1.其中有一瓶有毒,得出编号;2.全部都没有毒
  4.  * ***************************************************************
  5.  * 思路:10条狗,狗有中毒和不中毒两种状态,从信息学的角度看,10条狗可以
  6.  * 成为一个具有10位的二进制数。即可以表示1024(0~1023)个编号。将1000个瓶子编成0~999
  7.  * 号。将编号化成2进制表示。然后给对应的2进制上‘1’位置的狗服药。这样,服用
  8.  * 每瓶药的狗位置和数量是不同的,例如编号为2(0000000010)的药只给第二条狗喝。
  9.  * 而14号药(0000001110)只给第2,3,4条狗喝。这样到了最后从中毒的狗的编号和数量
  10.  * 上就可以判断有毒的药是哪一瓶了。当然如果后来没有狗中毒,那就是说没有药是有毒的。
  11.  * 两个结论都可以准确得出。(PS:这是在CSDN上看到的面试题,而思路也受到帖子中
  12.  * 高手的启发)
  13.  */
  14. package charles.testproject.dogandpoison;
  15. import java.lang.reflect.Array;
  16. import java.util.ArrayList;
  17. import java.util.Arrays;
  18. import java.util.Random;
  19. public class DogAndPoison {
  20.     public static void main(String[] args) {
  21.         /**
  22.          * get a instance of Random for create random number
  23.          */
  24.         Random r = new Random();
  25.          /**
  26.           * create a random number between 0 and 999(inclusive)
  27.           */
  28.         int randomNumber = r.nextInt(1000);
  29. System.out.println("The randomNumber is: " + randomNumber);
  30.         /**
  31.          * create a random number between 0 and 1(inclusive), the bottles of
  32.          * medicine is poisoned or not is depend on it. '0' stands
  33.          * for 'not' and '1' for the other situation.
  34.          */
  35.         int isPoisoned = r.nextInt(2);
  36. System.out.println("The vavual of isPoisoned is: " + isPoisoned);
  37.         /**
  38.          * get a array contains 1000 int numbers modeling 1000 bottles of medicine.
  39.          * one of them will be poisoned randomly or none of them is. 
  40.          */
  41.         int [] medicine = new int[1000];
  42.         if(isPoisoned == 1) {
  43.             medicine[randomNumber] = 1;
  44.         }
  45.         //代表10只狗,‘0’代表健康,‘1’代表中毒,初始化时为10只健康的狗
  46.         /**
  47.          * get a array contains 10 number modeling 10 dogs
  48.          * they was health when initialing.
  49.          */
  50.         int [] Dogs = {0000000000};
  51.         
  52.         for(int j=0; j<1000;j++) {
  53.             String binaryString = Integer.toBinaryString(j);
  54.             int length = binaryString.length();
  55.             int dength = Dogs.length;
  56.             //补齐十位二进制数字符串,在前面加‘0’
  57.             for(int n = 0; n < (Dogs.length - length); n++) {
  58.                 binaryString = "0" + binaryString;
  59.             }
  60.             //将字符串转为char类型数组
  61.             //translate the String <binaryString> into a char array.
  62.             char[] cArr = binaryString.toCharArray();
  63.             //给对应瓶子号码的的二进制符上为‘1’的狗喂该瓶药.
  64.             for(int k = cArr.length - 1; k >= 0; k--) {
  65.                 if(cArr[k] == '1') {
  66.                     Dogs[k] += medicine[j];
  67.                 }
  68.             }
  69.         }
  70.         
  71.         //
  72. System.out.println("20 hours later: the situation about the 10 dogs" +
  73.                    "('1'means poisioned ,'0' means not ): ");
  74. System.out.println(Arrays.toString(Dogs));
  75.         int p =1;
  76.         int result = 0;
  77.         for(int h=Dogs.length - 1; h>=0; h--) {
  78.             result += Dogs[h] * p;
  79.             p *= 2;
  80.         }
  81.         if(result!=0) {
  82.             System.out.println("The medicine had been poisoned,the number of the poisoned bottle is: " + result);
  83.         } else {
  84.             System.out.println("The medicine are all clean!");
  85.         }
  86.     }
  87. }
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值