###今天做到一个题目,想分享一下。 ###题目是这样子的:小明今日想吃各种各样的食物,请你将所有情况罗列出来,比如水果[哈密瓜,苹果,葡萄],主食[米饭,面条,汉堡],配菜[鸡蛋,黄瓜,土豆]
public static List<String> allList = new ArrayList<>();
public static List<String> finalList = new ArrayList<>();
public static List<String> list1 = Arrays.asList(new String[]{"哈密瓜", "苹果", "葡萄"});
public static List<String> list2 = Arrays.asList(new String[]{"米饭", "面条", "汉堡"});
public static List<String> list3 = Arrays.asList(new String[]{"鸡蛋", "黄瓜", "土豆"});
public static void main(String[] args) {
allList.addAll(list1);
allList.addAll(list2);
allList.addAll(list3);
combine(0,3,allList);
}
/**
* 组合
* 按一定的顺序取出元素,就是组合,元素个数[C arr.len 3]
* @param index 元素位置
* @param k 选取的元素个数
* @param arr 数组
*/
public static void combine(int index,int k,List<String> arr) {
if(k == 1){
for (int i = index; i < arr.size(); i++) {
finalList.add(arr.get(i));
//判断是否每一个输出的每一个元素都是在不同的集合中 todo 这里还需要优化一下 不然每加一个数组 这里就要多加一个判断
if(list1.contains(finalList.get(0)) && list2.contains(finalList.get(1)) && list3.contains(finalList.get(2))){
System.out.println(finalList.toString());
}
finalList.remove(arr.get(i));
}
}else if(k > 1){
for (int i = index; i <= arr.size() - k; i++) {
finalList.add(arr.get(i)); //finalList都是临时性存储一下
combine(i + 1,k - 1, arr); //索引右移,内部循环,自然排除已经选择的元素
finalList.remove((Object)arr.get(i)); //finalList因为是临时存储的,上一个组合找出后就该释放空间,存储下一个元素继续拼接组合了
}
}else{
return ;
}
}
###心得 这道题核心在于怎么去理解这个组合,如果单单用三层for循环其实也是可以得出结果的,但是这种方法可能不适用于集合多的情况,所以需要综合考虑一下。