突然看到的腾讯面试题,自己想了也参考,记录下
1000瓶药水,其中至多有1瓶剧毒,现在给你10只小狗在24小时内通过小狗试药的方式找出哪瓶药有毒或者全部无毒(小狗服完药20小时后才能判断是否中毒)。
package interview.com.montnets.one;
public class Medicine {
/**
* 返回该药水的二进制字符串
*
* @param dogs
* @return
*/
public String getMedid(String dogs) {
// 将狗的编号参数转换为数组
String[] dogarray = dogs.split(",");
// 拿到最后一位数,知道该二进制有多长---这里默认是排序好的,若没排序取其中最大值自行优化
int last = Integer.parseInt(dogarray[dogarray.length - 1]);
// StringBuilder动态分配内存
StringBuilder res = new StringBuilder(last);
// 将药水编号所有位赋予0
for (int i = 0; i < last; i++) {
// sbf.append("0");
res = res.append("0");
}
System.out.println("所有赋予0位:" + res);
// 根据传来的参数看中毒狗的编号,变为1
for (int j = 0; j < dogarray.length; j++) {
res.replace(Integer.parseInt(dogarray[j]), Integer.parseInt(dogarray[j]), "1");
}
// StringBuilder动态分配内存,会有多出来的
String laststr = res.substring(0, last + 1);
// 不截取时---00101011010000
// return res.toString();
System.out.println(dogs + "转换为药水编号为:" + laststr);
return laststr;
}
/**
* 将二进制转为十进制
*
* @return
*/
public long toDecimal(String str) {
long m = Long.valueOf(str, 2);
//System.out.println("编号为" + str + "的药水转为十进制为:" + m);
return m;
}
/**
* 测试
*/
public static void main(String[] args) {
Medicine m = new Medicine(123);
String medidStr=m.getmedid("0,1,2,3,4,9");
m.toDecimal(medidStr);
}
}
参考:https://blog.csdn.net/wohaqiyi/article/details/80921463