第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

算法之?dāng)?shù)學(xué)自由組合問(wèn)題(從M個(gè)不重復(fù)的數(shù)字中選取N個(gè)數(shù)字進(jìn)行自由組合)

今天,遇到一个同事的问题,要求给定从给定的5个不重复的数字中,取出3个数字,输出所有的组合情况。其实就是数学中的组合问题。以前仅仅做的是关于求出组合的情况数,这个很简单,用递归就可以求解。这题要求列举出所有情况。在网上进行一阵狂搜,最后找到了一个比较好理解的算法,叫“二进制置换算法”,先姑且这样叫吧。算法思想如下:
1、先定义一个数组,用1和0进行组合。其中1和0的总数为5个(即M),1表示命中(或被选中),所以1的总数为3(N)个。
2、那么初始状态可以设置为11100,称为一个状态码。
3、对初始状态是5选3的一种状态,再对这种状态进行后续分析。
4、分析如下:
a.从左到右,遇到第一次出现的10组合时,将其置为01。
b.判断最左边的第1位,如果为1,继续重复a步骤。如果为0,则将置换点之前的1移动到最左边。然后,再重复a步骤。
c.所有情况置换结束的条件是不再出现10组合,即表示已经得到了所有的情况。
5、根据第4步得到的所有状态码进行分析,将所有为1的位置,输出数组中对应的信息,即可得到一个数组的所有情况。
例如:
1 1 1 0 0
1 1 0 1 0
1 0 1 1 0
0 1 1 1 0
1 1 0 0 1
1 0 1 0 1
0 1 1 0 1
1 0 0 1 1
0 1 0 1 1
0 0 1 1 1//该状态码中不再出现10信息,即置换结束
代码如下:

public class Util {  
    //构造2进制字符串  
        public static String stringConstruction(int m,int n){  
            String testsString="";  
            for(int i=1;i<=m;i++){  
                if(i>n)  
                    testsString=testsString+"0";  
                else   
                    testsString=testsString+"1";  
            }  
            return testsString;  
        }  

        //二进制置换算法  
        public static List<String> allConditons(String s){  
            List<String> list = new ArrayList<String>();  
            list.add(s);  
            //;  
            while(true){  
                int length = list.size()-1;  
                //标志位  
                int flag = list.get(length).indexOf("10");  
                if(flag<0)  
                    break;  
                //先取最后一个元素  
                String last =list.get(length);  
                //判断该元素第1位字符  
                if(last.indexOf("0")>0){  
                    list.add(last.replaceFirst("10", "01"));  
                }  
                else {  
                    //先将10变成01  
                    String ss = last.replaceFirst("10", "01");  
                    //将10前面的内容反置  
                    String before = last.substring(0,last.indexOf("10"));  
                    StringBuffer sb = new StringBuffer(before);  
                    String after=sb.reverse().toString();  
                    list.add(ss.replaceFirst(before, after));  
                }  
            }  

            return list;  
        }  
        //通过置换算法获取自由组合  
        public static List<String> result(String[] r,List<String> list){  
            List<String> ttList =new ArrayList<String>();  

            for(int i=0;i<list.size();i++){  
                String eleString = list.get(i);  
                String temp="";  
                for(int j=0;j<eleString.length();j++){  
                    if(eleString.charAt(j)=='1')  
                        temp=temp+r[j]+" ";  
                }  
                ttList.add(temp);  
            }  
            //ttList去重操作,通过HashSet去重  
            HashSet<String> hs = new HashSet<String>(ttList);  
            ttList.clear();  
            ttList.addAll(hs);  
            return ttList;  
        }  
}  
點(diǎn)擊查看更多內(nèi)容
TA 點(diǎn)贊

若覺(jué)得本文不錯(cuò),就分享一下吧!

評(píng)論

作者其他優(yōu)質(zhì)文章

正在加載中
  • 推薦
  • 評(píng)論
  • 收藏
  • 共同學(xué)習(xí),寫(xiě)下你的評(píng)論
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說(shuō)多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開(kāi)微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊(cè)有機(jī)會(huì)得

100積分直接送

付費(fèi)專欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)

舉報(bào)

0/150
提交
取消