成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

遞歸解決一種排列組合的方法

voidking / 1089人閱讀

摘要:解決思路可以將相同屬性的值放到一個(gè)中,規(guī)定一個(gè)的子類,如,將所有的相同屬性值都放到一個(gè)中去,此時(shí)有多少個(gè)屬性就可以得到多少個(gè)封裝了相同屬性值的。

問題場景:

比如說一件商品有3中屬性,每個(gè)屬性又有3種不同的值,那么此時(shí)問,這幾種屬性可能的組合性,相信你很快就得到結(jié)果為"333=27"種,此時(shí)你可以實(shí)現(xiàn)的方式可以為三個(gè)for循環(huán)嵌套來實(shí)現(xiàn),那么如果場景變了,如果是4種屬性,那你可能就要4個(gè)for循環(huán),那么如果此時(shí)又變成10個(gè),那是不是要用10個(gè)循環(huán)了,此時(shí)的代碼就顯得笨重并且不易讀,所以此時(shí)我們就可以用遞歸實(shí)現(xiàn)此業(yè)務(wù)場景。**

解決思路:

1、可以將相同屬性的值放到一個(gè)List中,規(guī)定一個(gè)List的子類,如ArrayList,將所有的相同屬性值都放到一個(gè)ArrayList中去,此時(shí)有多少個(gè)屬性就可以得到多少個(gè)封裝了相同屬性值的ArrayList。
2、將上述生成的所有的ArrayList都放到個(gè)List中,即List>;
3、然后將上述List中的ArrayList順序兩個(gè)組合成一個(gè)新的LinkedList,此處新List子類型是為了和之前的ArrayList區(qū)分開來,以便后續(xù)區(qū)分對待。詳見代碼

代碼示例:
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,如果小于說明已經(jīng)遞歸完成了
        if (len<2){
            returnList=dataLists;
            return;
        }

        //第一個(gè)是 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 ;
        //第二個(gè)一定是 ArrayList
        ArrayList secondList = (ArrayList)dataLists.get(1);
        len1 = ((ArrayList)dataLists.get(1)).size();

        //定義臨時(shí)存放排列數(shù)據(jù)的集合默認(rèn)的是ArrayList,新組合的是 LinkedList
        LinkedList> tempdataLists=new LinkedList<>();

        //第一層for就是循環(huán)dataLists第一個(gè)元素的
        for (int i=0;i){
                    ArrayList arr0= (ArrayList) dataLists.get(0);
                    // 創(chuàng)建LinkedList類型與ArrayList區(qū)分開來,用于將新的數(shù)據(jù)重新存儲(chǔ)
                    LinkedList arr=new LinkedList<>();
                    arr.add(arr0.get(i));
                    arr.add(secondList.get(j));
                    //把排列數(shù)據(jù)加到臨時(shí)的集合中
                    tempdataLists.add(arr);
                } else {
                    //到這里就明循環(huán)了最少一輪,即數(shù)據(jù)中只剩下兩個(gè),一個(gè)是LinkedList,一個(gè)是ArrayList
                    LinkedList> arrtemp= (LinkedList>) dataLists.get(0);
                    LinkedList arr=new LinkedList<>();
                    // 取出老的LinkedList數(shù)據(jù)賦值給新的LinkedList,同時(shí)把第二個(gè)ArrayList中的數(shù)據(jù)賦值給新的LinkedList
                    for (int k=0;k();
        //把還沒排列的數(shù)組裝進(jìn)來,看清楚i=2的喔,因?yàn)榍懊鎯蓚€(gè)數(shù)組已經(jīng)完事了,不需要再加進(jìn)來了
        for (int i=2;i
運(yùn)行結(jié)果:

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]]]

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/69264.html

相關(guān)文章

  • 遞歸小結(jié)(一)

    摘要:感悟?qū)⑦f歸當(dāng)作一種類似的控制結(jié)構(gòu),通過迭代求解問題,遞歸通過分治求解問題。遞歸解決問題的環(huán)節(jié)是明確簡單情形明確相同形式的子問題。楊輝三角代碼分析簡單情形,可以理解為遞歸的終止條件,簡單情形里將不遞歸調(diào)用或者理解為無法用遞歸解決的情形。 感悟 將遞歸當(dāng)作一種類似for/while的控制結(jié)構(gòu),for/while 通過迭代求解問題,遞歸通過分治求解問題。遞歸是這樣解決問題的。首先,這個(gè)問題存...

    myeveryheart 評論0 收藏0
  • July 算法習(xí)題 - 字符串4(全排列和全組合

    摘要:求字符串的全排列字符串的全排列設(shè)計(jì)一個(gè)算法,輸出一個(gè)字符串字符的全排列。的做法沒有結(jié)果的,都是在一個(gè)字符串上進(jìn)行的操作。字符串的全組合輸入三個(gè)字符,則它們的組合有。因此可以循環(huán)字符串長度,然后輸出對應(yīng)代表的組合即可。 求字符串的全排列 字符串的全排列 設(shè)計(jì)一個(gè)算法,輸出一個(gè)字符串字符的全排列。 比如,String = abc 輸出是abc,bac,cab,bca,cba,...

    tuniutech 評論0 收藏0
  • JS 字符串全排列算法及內(nèi)存溢出

    摘要:問題給定字符串,求出所有由該串內(nèi)字符組合的全排列。于是我想的辦法是利用尾遞歸優(yōu)化。算法二尾遞歸終止條件長度為第一次遞歸時(shí),插入首字母遞歸截取了第一個(gè)字符的子串函數(shù)的第一個(gè)參數(shù)是本次遞歸的字符串,第二個(gè)參數(shù)是前個(gè)字符的全排列結(jié)果。 問題 給定字符串,求出所有由該串內(nèi)字符組合的全排列。所包含的字符不重復(fù)。 輸入:abc 輸出:[abc,acb,bac,bca,cab,cba] 我在實(shí)現(xiàn)算法...

    sihai 評論0 收藏0
  • 前端也需要好好精進(jìn)自己算法

    摘要:算法前端發(fā)展的再快,也不要忘記精進(jìn)自己的算法,算法是靈魂和核心。我會(huì)把我刷過的算法題總結(jié)歸類,不斷完善。 算法 前端發(fā)展的再快,也不要忘記精進(jìn)自己的算法,算法是靈魂和核心。我會(huì)把我刷過的算法題總結(jié)歸類,不斷完善。歡迎大家關(guān)注。 數(shù)組和堆棧 數(shù)組去重 旋轉(zhuǎn)數(shù)組 如何快速找出兩個(gè)數(shù)之和等于某一個(gè)值的兩個(gè)數(shù)? 快排 排序算法大總結(jié) 快速找到數(shù)組中的最大值 多維數(shù)組的展開 二分查找 有效的括...

    hersion 評論0 收藏0
  • LeetCode 子集合,排列組合,回文分離等問題通用遞歸算法

    摘要:通用算法思路總結(jié)初始結(jié)果列表??赡芤獙?shù)集排序,方便處理重復(fù)元素的情況。書寫遞歸函數(shù),先要考慮原點(diǎn)狀況,一般就是考慮什么情況下要將當(dāng)前結(jié)果添加到結(jié)果列表中。每當(dāng)一個(gè)元素添加到當(dāng)前結(jié)果中之后,要再調(diào)用遞歸函數(shù),相當(dāng)于固定了前綴窮舉后面的變化。 通用算法思路總結(jié): 初始結(jié)果列表。 可能要將數(shù)集排序,方便處理重復(fù)元素的情況。 調(diào)用遞歸函數(shù)。 書寫遞歸函數(shù),先要考慮原點(diǎn)狀況,一般就是考慮什么...

    cfanr 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<