找实习工作遇到的笔试题:
解题思路:用两个集合分别代表河的两岸(list2表示对岸),利用双重for循环模拟A,B,C,D分别组合过河,如:A,B先过河,则,将A,B都添加到list2集合中去。如果A的时间大于B,则B再次过河送手电筒,再一次将B添加到集合中去。反之同理。
总之,时间短的过河送手电筒,这样过河一次,就添加到集合中去一次,最后foreach出list2集合中的所有元素相加,得到所有可能得到的时间。
public class ttt {
private List<Integer> list = new ArrayList<Integer>();
private List<Integer> list2 = new ArrayList<Integer>();
private int sum=0;
@Test
public void test(){
int sum = 0;
list.add(1);
list.add(2);
list.add(5);
list.add(10);
for (int i = 0; i < list.size()-1; i++) {
for (int j = 1; j < list.size(); j++) {
if (list.get(i)<list.get(j)) {
list2.add(list.get(j));//i,j元素到对岸
list2.add(list.get(i));//i元素回去送手电筒
//判断之前没过河剩下的两个元素时间大小,大的添加到集合中去
if (list.get(list.size()-i-1)<list.get(list.size()-j-1)) {
list2.add(list.get(list.size()-j-1));
}else {
list2.add(list.get(list.size()-i-1));
}
list2.add(list.get(j));//第一批过河那个大的元素回去接小的
list2.add(list.get(j));//一起过河
for (int num : list2) {//遍历出所有元素并相加
// System.out.println(num);
sum +=num;
}
System.out.println("sum="+sum);
list2.clear();
sum = 0;
}//else{
// list2.clear();
// list2.add(list.get(i));
// list2.add(list.get(j));
// if (list.get(list.size()-i-1)<list.get(list.size()-j-1)) {
// list2.add(list.get(list.size()-j-1));
// }else {
// list2.add(list.get(list.size()-i-1));
// }
// list2.add(list.get(i));
// list2.add(list.get(j));
// for (int num : list2) {
// sum +=num;
// }
//// System.out.println(sum);
// list2.clear();
// sum = 0;
// }
}
}
}
}