找假酒
有一批拥有编号的酒,里面包含一瓶假酒。假酒重量比真酒轻,称重几次能将假酒找出来?
例子:有50瓶酒,其中编号50的酒为假酒。第一次:将酒分为两部分(1-25号):(26-50号);
50号属于26-50号,所以再将26-50号的酒分为两部分(26-37) (38-49) 比较出来 两部分酒一样重,所以余下的50号酒酒为假酒。
public static int res(int start, int end, int b, int num) {
//调用一次分割区间函数num就加1
num++;
if (end - start == 1) {
return num;
}
//分割后每个区间有mid个数
int mid = (end - start + 1) / 2;
int temp, ended;
temp = start + mid - 1;
//因为temp是区间一的闭区间数,区间二的开区间数为temp+1;区间有mid个数 但是又包含temp+1这个数 所以 endedd = temp +1 + mid -1
ended = temp + mid;
if (temp >= b) {
return res(start, temp, b, num);
} else if (temp < b && b <= ended) {
return res(temp + 1, ended, b, num);
}
//如果不属于两个区间 那就是舍去的那个数
return num;
}
求最消星星的最大乘积
一个队列 消除一个就会得到相邻两个数的乘积。第一位和最后一位不能消除。
比如一个队列为{1,2,8} 消除2得到乘积8; {2,1,2,1} 消除1得到乘积4,剩下队列{2,2,1}消除2得到乘积4+2=6;剩下队列{2,1}无法进行消除,所以结果为6
public static int xiaochu(ArrayList<Integer> list, int res) {
if (list.size() < 3) {
return res;
} else {
int temp = 0;
if (list.contains(0)) {
int zero = list.indexOf(0);
if (zero != 0 && zero != list.size() - 1) {
res = res + list.get(zero - 1) * list.get(zero + 1);
list.remove(zero);
return xiaochu(list, res);
}
}
for (int i = 1; i < list.size() - 1; i++) {
if (list.get(i) > temp) {
temp = list.get(i);
}
}
int maxIndex = list.indexOf(temp);
int maxl = 0;
int maxr = 0;
if (maxIndex - 2 >= 0) {
maxl = list.get(maxIndex - 2) * temp;
} else if (maxIndex + 2 <= list.size() - 1) {
maxr = list.get(maxIndex + 2) * temp;
} else {
res = res + list.get(maxIndex - 1) * list.get(maxIndex + 1);
list.remove(maxIndex);
}
if (maxl > maxr) {
res = res + maxl;
list.remove(maxIndex - 1);
} else if (maxl < maxr) {
res = res + maxr;
list.remove(maxIndex + 1);
}
return xiaochu(list, res);
}
}