- /**
- *题目: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上看到的面试题,而思路也受到帖子中
- *高手的启发)
- */
- packagecharles.testproject.dogandpoison;
- importjava.lang.reflect.Array;
- importjava.util.ArrayList;
- importjava.util.Arrays;
- importjava.util.Random;
- publicclassDogAndPoison{
- publicstaticvoidmain(String[]args){
- /**
- *getainstanceofRandomforcreaterandomnumber
- */
- Randomr=newRandom();
- /**
- *createarandomnumberbetween0and999(inclusive)
- */
- intrandomNumber=r.nextInt(1000);
- System.out.println("TherandomNumberis:"+randomNumber);
- /**
- *createarandomnumberbetween0and1(inclusive),thebottlesof
- *medicineispoisonedornotisdependonit.'0'stands
- *for'not'and'1'fortheothersituation.
- */
- intisPoisoned=r.nextInt(2);
- System.out.println("ThevavualofisPoisonedis:"+isPoisoned);
- /**
- *getaarraycontains1000intnumbersmodeling1000bottlesofmedicine.
- *oneofthemwillbepoisonedrandomlyornoneofthemis.
- */
- int[]medicine=newint[1000];
- if(isPoisoned==1){
- medicine[randomNumber]=1;
- }
- //代表10只狗,‘0’代表健康,‘1’代表中毒,初始化时为10只健康的狗
- /**
- *getaarraycontains10numbermodeling10dogs
- *theywashealthwheninitialing.
- */
- int[]Dogs={0,0,0,0,0,0,0,0,0,0};
- for(intj=0;j<1000;j++){
- StringbinaryString=Integer.toBinaryString(j);
- intlength=binaryString.length();
- intdength=Dogs.length;
- //补齐十位二进制数字符串,在前面加‘0’
- for(intn=0;n<(Dogs.length-length);n++){
- binaryString="0"+binaryString;
- }
- //将字符串转为char类型数组
- //translatetheString<binaryString>intoachararray.
- char[]cArr=binaryString.toCharArray();
- //给对应瓶子号码的的二进制符上为‘1’的狗喂该瓶药.
- for(intk=cArr.length-1;k>=0;k--){
- if(cArr[k]=='1'){
- Dogs[k]+=medicine[j];
- }
- }
- }
- //
- System.out.println("20hourslater:thesituationaboutthe10dogs"+
- "('1'meanspoisioned,'0'meansnot):");
- System.out.println(Arrays.toString(Dogs));
- intp=1;
- intresult=0;
- for(inth=Dogs.length-1;h>=0;h--){
- result+=Dogs[h]*p;
- p*=2;
- }
- if(result!=0){
- System.out.println("Themedicinehadbeenpoisoned,thenumberofthepoisonedbottleis:"+result);
- }else{
- System.out.println("Themedicineareallclean!");
- }
- }
- }
1000瓶药,至多1瓶有毒,用10条狗(老鼠)试毒的面试题
最新推荐文章于 2023-10-11 18:50:04 发布