1000瓶药,至多1瓶有毒,用10条狗(老鼠)试毒的面试题
2008-11-04 14:34
323 查看
/**
* 题目:1000瓶毒药至多有一瓶有毒,10条狗用于试毒,狗在服药20小时后会出现中毒症状,
* 你有24小时得出结论:1.其中有一瓶有毒,得出编号;2.全部都没有毒
* ***************************************************************
* 思路:10条狗,狗有中毒和不中毒两种状态,从信息学的角度看,10条狗可以
* 成为一个具有10位的二进制数。即可以表示1024(0~1023)个编号。将1000个瓶子编成0~999
* 号。将编号化成2进制表示。然后给对应的2进制上‘1’位置的狗服药。这样,服用
* 每瓶药的狗位置和数量是不同的,例如编号为2(0000000010)的药只给第二条狗喝。
* 而14号药(0000001110)只给第2,3,4条狗喝。这样到了最后从中毒的狗的编号和数量
* 上就可以判断有毒的药是哪一瓶了。当然如果后来没有狗中毒,那就是说没有药是有毒的。
* 两个结论都可以准确得出。(PS:这是在CSDN上看到的面试题,而思路也受到帖子中
* 高手的启发)
*/
package charles.testproject.dogandpoison;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Random;
public class DogAndPoison {
public static void main(String[] args) {
/**
* get a instance of Random for create random number
*/
Random r = new Random();
/**
* create a random number between 0 and 999(inclusive)
*/
int randomNumber = r.nextInt(1000);
System.out.println("The randomNumber is: " + randomNumber);
/**
* create a random number between 0 and 1(inclusive), the bottles of
* medicine is poisoned or not is depend on it. '0' stands
* for 'not' and '1' for the other situation.
*/
int isPoisoned = r.nextInt(2);
System.out.println("The vavual of isPoisoned is: " + isPoisoned);
/**
* get a array contains 1000 int numbers modeling 1000 bottles of medicine.
* one of them will be poisoned randomly or none of them is.
*/
int [] medicine = new int[1000];
if(isPoisoned == 1) {
medicine[randomNumber] = 1;
}
//代表10只狗,‘0’代表健康,‘1’代表中毒,初始化时为10只健康的狗
/**
* get a array contains 10 number modeling 10 dogs
* they was health when initialing.
*/
int [] Dogs = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
for(int j=0; j<1000;j++) {
String binaryString = Integer.toBinaryString(j);
int length = binaryString.length();
int dength = Dogs.length;
//补齐十位二进制数字符串,在前面加‘0’
for(int n = 0; n < (Dogs.length - length); n++) {
binaryString = "0" + binaryString;
}
//将字符串转为char类型数组
//translate the String <binaryString> into a char array.
char[] cArr = binaryString.toCharArray();
//给对应瓶子号码的的二进制符上为‘1’的狗喂该瓶药.
for(int k = cArr.length - 1; k >= 0; k--) {
if(cArr[k] == '1') {
Dogs[k] += medicine[j];
}
}
}
//
System.out.println("20 hours later: the situation about the 10 dogs" +
"('1'means poisioned ,'0' means not ): ");
System.out.println(Arrays.toString(Dogs));
int p =1;
int result = 0;
for(int h=Dogs.length - 1; h>=0; h--) {
result += Dogs[h] * p;
p *= 2;
}
if(result!=0) {
System.out.println("The medicine had been poisoned,the number of the poisoned bottle is: " + result);
} else {
System.out.println("The medicine are all clean!");
}
}
}
* 题目:1000瓶毒药至多有一瓶有毒,10条狗用于试毒,狗在服药20小时后会出现中毒症状,
* 你有24小时得出结论:1.其中有一瓶有毒,得出编号;2.全部都没有毒
* ***************************************************************
* 思路:10条狗,狗有中毒和不中毒两种状态,从信息学的角度看,10条狗可以
* 成为一个具有10位的二进制数。即可以表示1024(0~1023)个编号。将1000个瓶子编成0~999
* 号。将编号化成2进制表示。然后给对应的2进制上‘1’位置的狗服药。这样,服用
* 每瓶药的狗位置和数量是不同的,例如编号为2(0000000010)的药只给第二条狗喝。
* 而14号药(0000001110)只给第2,3,4条狗喝。这样到了最后从中毒的狗的编号和数量
* 上就可以判断有毒的药是哪一瓶了。当然如果后来没有狗中毒,那就是说没有药是有毒的。
* 两个结论都可以准确得出。(PS:这是在CSDN上看到的面试题,而思路也受到帖子中
* 高手的启发)
*/
package charles.testproject.dogandpoison;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Random;
public class DogAndPoison {
public static void main(String[] args) {
/**
* get a instance of Random for create random number
*/
Random r = new Random();
/**
* create a random number between 0 and 999(inclusive)
*/
int randomNumber = r.nextInt(1000);
System.out.println("The randomNumber is: " + randomNumber);
/**
* create a random number between 0 and 1(inclusive), the bottles of
* medicine is poisoned or not is depend on it. '0' stands
* for 'not' and '1' for the other situation.
*/
int isPoisoned = r.nextInt(2);
System.out.println("The vavual of isPoisoned is: " + isPoisoned);
/**
* get a array contains 1000 int numbers modeling 1000 bottles of medicine.
* one of them will be poisoned randomly or none of them is.
*/
int [] medicine = new int[1000];
if(isPoisoned == 1) {
medicine[randomNumber] = 1;
}
//代表10只狗,‘0’代表健康,‘1’代表中毒,初始化时为10只健康的狗
/**
* get a array contains 10 number modeling 10 dogs
* they was health when initialing.
*/
int [] Dogs = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
for(int j=0; j<1000;j++) {
String binaryString = Integer.toBinaryString(j);
int length = binaryString.length();
int dength = Dogs.length;
//补齐十位二进制数字符串,在前面加‘0’
for(int n = 0; n < (Dogs.length - length); n++) {
binaryString = "0" + binaryString;
}
//将字符串转为char类型数组
//translate the String <binaryString> into a char array.
char[] cArr = binaryString.toCharArray();
//给对应瓶子号码的的二进制符上为‘1’的狗喂该瓶药.
for(int k = cArr.length - 1; k >= 0; k--) {
if(cArr[k] == '1') {
Dogs[k] += medicine[j];
}
}
}
//
System.out.println("20 hours later: the situation about the 10 dogs" +
"('1'means poisioned ,'0' means not ): ");
System.out.println(Arrays.toString(Dogs));
int p =1;
int result = 0;
for(int h=Dogs.length - 1; h>=0; h--) {
result += Dogs[h] * p;
p *= 2;
}
if(result!=0) {
System.out.println("The medicine had been poisoned,the number of the poisoned bottle is: " + result);
} else {
System.out.println("The medicine are all clean!");
}
}
}
相关文章推荐
- “1000瓶药水,其中至多有1瓶剧毒,小狗服完药20小时后才能判断是否中毒。现在给你10只小狗、在24小时内、通过小狗试药的方式找出哪瓶药有毒或者全部无毒”
- “1000瓶药水,其中至多有1瓶剧毒,小狗服完药20小时后才能判断是否中毒。现在给你10只小狗、在24小时内、通过小狗试药的方式找出哪瓶药有毒或者全部无毒”
- 面试题:1000瓶水其中有一瓶水有毒,有10只老鼠并且只要老鼠喝了有毒的水必死。请问怎样通过一次实验找出有毒的那瓶水。
- 10条狗试1000瓶水是否有毒
- 1000瓶酒其中1瓶有毒,10只老鼠找出毒酒
- c语言:1000瓶水,有一瓶是有毒的,现共有10只老鼠,怎么判断毒水?
- 1000瓶水中找 出有毒的那瓶,毒性一周后发作,一周内最少需要多少只老鼠
- 1000瓶药有1瓶有毒,需要多少只小白鼠才能试验找出
- 有10狗,1000瓶药水,其中有一瓶有毒,狗喝一下点就会死,请问怎么找到1000瓶中有毒的那一瓶?
- 1000瓶水中找 出有毒的那瓶,毒性一周后发作,一周内最少需要多少只老鼠
- 1000瓶水中找 出有毒的那瓶,毒性一周后发作,一周内最少需要多少只老鼠
- 1000瓶药有1瓶有毒,需要多少只小白鼠才能试验找出
- c语言:1000瓶水,有一瓶是有毒的,现共有10只老鼠,怎么判断毒水?
- 1000瓶水和1瓶毒水还有10只老鼠
- JAVA企业面试题精选 JDBC 1-10
- 面试题10:二进制中1的个数
- 算法与数据结构面试题(10)-颠倒链表
- 提给程序员和开发者的 10 道 Java 泛型面试题
- 腾讯面试题:服务器内存1G,有一个2G的文件,里面每行存着一个QQ号(5-10位数),怎么最快找出出现过最多次的QQ号。
- shell 百例收集10 部分面试题