一、问题
有11瓶啤酒,1瓶有毒。喝酒之后,三天会死,只有三天时间。请问至少需要多少只老鼠,可以找到9瓶没有毒的?
二、代码
public class UnluckyRat {
public static void main(String[] args) {
System.out.println("问题:有11瓶啤酒,1瓶有毒。喝酒之后,三天会死,只有三天时间。请问至少需要多少只老鼠,可以找到9瓶没有毒的?");
System.out.println("===================================================================================================");
System.out.println("解析:");
System.out.println(" 1、将编号1-11的酒转换为二进制");
List<String> binaryBeers = new ArrayList<>();
for(int i = 1;i < 12; i ++){
String result = Integer.toBinaryString(i);
while(result.length() < 4) {
result = "0" + result;
}
binaryBeers.add(result);
}
System.out.println(" " + binaryBeers);
System.out.println(" 2、编号为1的小白鼠喝 末位为1 的酒");
//firstRat 喝末位为1的酒
List<String> firstRat = binaryBeers.stream().filter(s -> s.endsWith("1")).collect(Collectors.toList());
System.out.println(" " + firstRat);
System.out.println(" 编号为2的小白鼠 喝倒数第二位为1 的酒");
//secondRat 喝倒数第二位为1的酒
List<String> secondRat = binaryBeers.stream().filter(s -> s.substring(0,s.length()-1).endsWith("1")).collect(Collectors.toList());
System.out.println(" " + secondRat);
System.out.println(" 编号为3的小白鼠 喝倒数第三位为1 的酒");
//thirdRat 喝倒数第三位为1的酒
List<String> thirdRat = binaryBeers.stream().filter(s -> s.substring(0,s.length()-2).endsWith("1")).collect(Collectors.toList());
System.out.println(" " + thirdRat);
System.out.println(" 3、通过三只老鼠的生存状况 来判断是否满足9瓶酒没有毒");
//三只老鼠的生存状况 1死 0活
List<String> ratIsLive = new ArrayList<>();
for(int i = 0; i < 8; i ++){
String result = Integer.toBinaryString(i);
while(result.length() < 3) {
result = "0" + result;
}
ratIsLive.add(result);
}
System.out.println(" 共有 8 种可能:" + ratIsLive);
System.out.println(" 以 000 三只老鼠均未死为例:");
//000 三只都未死
List<String> firstResult = new ArrayList<>();
addAll(firstRat,secondRat,firstResult);
addAll(secondRat,thirdRat,firstResult);
Set<String> secondResult = new HashSet<>();
secondResult.addAll(firstResult);
List<String> thirdResult = new ArrayList<>();
thirdResult.addAll(secondResult);
Integer finalResult[] = new Integer[thirdResult.size()];
for(int i = 0 ; i < thirdResult.size(); i ++){
finalResult[i] = Integer.valueOf(thirdResult.get(i),2);
}
Arrays.sort(finalResult);
System.out.println(" 没有毒的啤酒编号:" + Arrays.toString(finalResult));
}
public static void addAll(List list1,List list2,List list3){
list3.addAll(list1);
for(int i = 0; i < list2.size(); i++){
for(int j = 0; j < list3.size(); j++){
if(list3.get(j).equals(list2.get(i))){
list3.remove(list3.get(j));
}
}
list3.add(list2.get(i));
}
}
}