51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

Java《排列组合》题目分享

###今天做到一个题目,想分享一下。 ###题目是这样子的:小明今日想吃各种各样的食物,请你将所有情况罗列出来,比如水果[哈密瓜,苹果,葡萄],主食[米饭,面条,汉堡],配菜[鸡蛋,黄瓜,土豆]

 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循环其实也是可以得出结果的,但是这种方法可能不适用于集合多的情况,所以需要综合考虑一下。

赞(6)
未经允许不得转载:工具盒子 » Java《排列组合》题目分享