资讯专栏INFORMATION COLUMN

递归解决一种排列组合的方法

voidking / 938人阅读

摘要:解决思路可以将相同属性的值放到一个中,规定一个的子类,如,将所有的相同属性值都放到一个中去,此时有多少个属性就可以得到多少个封装了相同属性值的。

问题场景:

比如说一件商品有3中属性,每个属性又有3种不同的值,那么此时问,这几种属性可能的组合性,相信你很快就得到结果为"333=27"种,此时你可以实现的方式可以为三个for循环嵌套来实现,那么如果场景变了,如果是4种属性,那你可能就要4个for循环,那么如果此时又变成10个,那是不是要用10个循环了,此时的代码就显得笨重并且不易读,所以此时我们就可以用递归实现此业务场景。**

解决思路:

1、可以将相同属性的值放到一个List中,规定一个List的子类,如ArrayList,将所有的相同属性值都放到一个ArrayList中去,此时有多少个属性就可以得到多少个封装了相同属性值的ArrayList。
2、将上述生成的所有的ArrayList都放到个List中,即List>;
3、然后将上述List中的ArrayList顺序两个组合成一个新的LinkedList,此处新List子类型是为了和之前的ArrayList区分开来,以便后续区分对待。详见代码

代码示例:
public class MainTest {
    
    private static List returnList = new ArrayList();
    public static void main(String[] args) {

        List> stateLists = new ArrayList>();
        ArrayList als1 = new ArrayList<>();
        als1.add("Color_1");
        als1.add("Color_2");
        ArrayList als2 = new ArrayList<>();
        als2.add("Style_1");
        als2.add("Style_2");
        ArrayList als3 = new ArrayList<>();
        als3.add("Size_1");
        als3.add("Size_2");
        ArrayList als4 = new ArrayList<>();
        als4.add("High_1");
        als4.add("High_2");
        stateLists.add(als1);
        stateLists.add(als2);
        stateLists.add(als3);
        stateLists.add(als4);

        addstatement(stateLists);
        System.out.println("returnList:"+returnList.size()+" "+returnList);
    }

    public static void addstatement(List dataLists){

        int len=dataLists.size();
        //判断List中的size是否小于2,如果小于说明已经递归完成了
        if (len<2){
            returnList=dataLists;
            return;
        }

        //第一个是 ArrayList 或 LinkedList()
        int len0 ;
        if(dataLists.get(0) instanceof  ArrayList){
            len0 = ((ArrayList)dataLists.get(0)).size();
        } else {
            len0 = ((LinkedList)dataLists.get(0)).size();
        }
        int len1 ;
        //第二个一定是 ArrayList
        ArrayList secondList = (ArrayList)dataLists.get(1);
        len1 = ((ArrayList)dataLists.get(1)).size();

        //定义临时存放排列数据的集合默认的是ArrayList,新组合的是 LinkedList
        LinkedList> tempdataLists=new LinkedList<>();

        //第一层for就是循环dataLists第一个元素的
        for (int i=0;i){
                    ArrayList arr0= (ArrayList) dataLists.get(0);
                    // 创建LinkedList类型与ArrayList区分开来,用于将新的数据重新存储
                    LinkedList arr=new LinkedList<>();
                    arr.add(arr0.get(i));
                    arr.add(secondList.get(j));
                    //把排列数据加到临时的集合中
                    tempdataLists.add(arr);
                } else {
                    //到这里就明循环了最少一轮,即数据中只剩下两个,一个是LinkedList,一个是ArrayList
                    LinkedList> arrtemp= (LinkedList>) dataLists.get(0);
                    LinkedList arr=new LinkedList<>();
                    // 取出老的LinkedList数据赋值给新的LinkedList,同时把第二个ArrayList中的数据赋值给新的LinkedList
                    for (int k=0;k();
        //把还没排列的数组装进来,看清楚i=2的喔,因为前面两个数组已经完事了,不需要再加进来了
        for (int i=2;i
运行结果:

returnList:1 [[[Color_1, Style_1, Size_1, High_1], [Color_1, Style_1, Size_1, High_2], [Color_1, Style_1, Size_2, High_1], [Color_1, Style_1, Size_2, High_2], [Color_1, Style_2, Size_1, High_1], [Color_1, Style_2, Size_1, High_2], [Color_1, Style_2, Size_2, High_1], [Color_1, Style_2, Size_2, High_2], [Color_2, Style_1, Size_1, High_1], [Color_2, Style_1, Size_1, High_2], [Color_2, Style_1, Size_2, High_1], [Color_2, Style_1, Size_2, High_2], [Color_2, Style_2, Size_1, High_1], [Color_2, Style_2, Size_1, High_2], [Color_2, Style_2, Size_2, High_1], [Color_2, Style_2, Size_2, High_2]]]

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/69264.html

相关文章

  • 递归小结(一)

    摘要:感悟将递归当作一种类似的控制结构,通过迭代求解问题,递归通过分治求解问题。递归解决问题的环节是明确简单情形明确相同形式的子问题。杨辉三角代码分析简单情形,可以理解为递归的终止条件,简单情形里将不递归调用或者理解为无法用递归解决的情形。 感悟 将递归当作一种类似for/while的控制结构,for/while 通过迭代求解问题,递归通过分治求解问题。递归是这样解决问题的。首先,这个问题存...

    myeveryheart 评论0 收藏0
  • July 算法习题 - 字符串4(全排列和全组合

    摘要:求字符串的全排列字符串的全排列设计一个算法,输出一个字符串字符的全排列。的做法没有结果的,都是在一个字符串上进行的操作。字符串的全组合输入三个字符,则它们的组合有。因此可以循环字符串长度,然后输出对应代表的组合即可。 求字符串的全排列 字符串的全排列 设计一个算法,输出一个字符串字符的全排列。 比如,String = abc 输出是abc,bac,cab,bca,cba,...

    tuniutech 评论0 收藏0
  • JS 字符串全排列算法及内存溢出

    摘要:问题给定字符串,求出所有由该串内字符组合的全排列。于是我想的办法是利用尾递归优化。算法二尾递归终止条件长度为第一次递归时,插入首字母递归截取了第一个字符的子串函数的第一个参数是本次递归的字符串,第二个参数是前个字符的全排列结果。 问题 给定字符串,求出所有由该串内字符组合的全排列。所包含的字符不重复。 输入:abc 输出:[abc,acb,bac,bca,cab,cba] 我在实现算法...

    sihai 评论0 收藏0
  • 前端也需要好好精进自己算法

    摘要:算法前端发展的再快,也不要忘记精进自己的算法,算法是灵魂和核心。我会把我刷过的算法题总结归类,不断完善。 算法 前端发展的再快,也不要忘记精进自己的算法,算法是灵魂和核心。我会把我刷过的算法题总结归类,不断完善。欢迎大家关注。 数组和堆栈 数组去重 旋转数组 如何快速找出两个数之和等于某一个值的两个数? 快排 排序算法大总结 快速找到数组中的最大值 多维数组的展开 二分查找 有效的括...

    hersion 评论0 收藏0
  • LeetCode 子集合,排列组合,回文分离等问题通用递归算法

    摘要:通用算法思路总结初始结果列表。可能要将数集排序,方便处理重复元素的情况。书写递归函数,先要考虑原点状况,一般就是考虑什么情况下要将当前结果添加到结果列表中。每当一个元素添加到当前结果中之后,要再调用递归函数,相当于固定了前缀穷举后面的变化。 通用算法思路总结: 初始结果列表。 可能要将数集排序,方便处理重复元素的情况。 调用递归函数。 书写递归函数,先要考虑原点状况,一般就是考虑什么...

    cfanr 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<