求个算法 二维数组{{1,2,3},{2,3,4},{5,2,3},{1,8,9},{2,3,4}} 内容不确定 n 表示 N位数 例如n=3 就是把上面的数组 排列组合成125,122,123,121,。。
n=4,则是1231,1258,1259,1252。。 这个排列组合怎么求出公式 。public void get(String[][] str ,n){   system.out.println("n个字符串长度的结果"+????)
}

解决方案 »

  1.   

    for example
    import java.util.*;
    public void get(String[][] str ,n){
        if (n > str.length) {n = str.length;}
        int[] idx = new int[n];
        Arrays.fill(idx, 0);
        List<String> list = new ArrayList<String>();
        while (idx[0] < str[0].length) {
            StringBuilder sb = new StringBuilder();
            for (int i=0; i<n; i++) {
                sb.append(str[i][idx[i]]);
            }
            list.add(sb.toString());        idx[n-1]++;
            for (int i=n-1; i>0; i--) {
                if (idx[i] == str[i].length) {
                    idx[i] = 0;
                    idx[i-1]++;
                } else {
                    break;
                }
            }
        }
        
      //system.out.println("n个字符串长度的结果"+????)
        int count = 0;
        for (String s : list) {
            System.out.printf("%s,", s);
            count++;
            if (count%10 == 0) {System.out.println();}
        }
    }
      

  2.   


    import java.util.*;import com.sun.corba.se.spi.orb.StringPair;
    public class a {
    public static long get(String[][] str ,int n){
    long num = 0;
        if (n > str.length) {n = str.length;}
        int[] idx = new int[n];
        Arrays.fill(idx, 0);
        List<String> list = new ArrayList<String>();
        while (idx[0] < str[0].length) {
            StringBuilder sb = new StringBuilder();
            for (int i=0; i<n; i++) {
                sb.append(str[i][idx[i]]);
            }
            list.add(sb.toString());
            idx[n-1]++;
            for (int i=n-1; i>0; i--) {
                if (idx[i] == str[i].length) {
                    idx[i] = 0;
                    idx[i-1]++;
                } else {
                    break;
                }
            }
        }
        
      //system.out.println("n个字符串长度的结果"+????)
        int count = 0;
        for (String s : list) {
            System.out.printf("%s,", s);
            count++;
            if (count%10 == 0) {System.out.println();}
        }
        return num;
    }
    public static void main(String[] arg){
    String[][] str = {{"1","0","3"},{"a","b","c"},{"A"},{"CUI","YUE"}};
    long num = get(str ,3);
    }
    }
      

  3.   

    好像理解LZ的意思了,就是N=3时,从数组中取出任意3个小数组,然后这3个小数组再组合,是这样吧import java.util.*;
    class Test {
        public static void main(String[] args) {
            int[][] data = {{1,2,3}, {2,3,4}, {5,2,3}, {1,8,9}, {2,3,4}};
            combine(data, 5);
        }
        public static void combine(int[][] data, int n){
            if (n > data.length) {n = data.length;}
            int[] idx = new int[data.length];
            for (int i=0; i<data.length; i++) {
                if (i<data.length-n) {idx[i]=0;}
                else {idx[i]=1;}
            }
            List<String> list = new ArrayList<String>();
            while (idx[0] < 2) {
                int cnt=0, dig=0;
                int[] gp = new int[n];
                for (int i=0; i<idx.length; i++) {
                    if (idx[i] == 1) {
                        if (i<n) {dig++;}
                        if (cnt<n) {gp[cnt] = i;}
                        cnt++;
                    }
                }
                if (n == cnt) {
                    int[] subIdx = new int[n];
                    Arrays.fill(subIdx, 0);
                    while (subIdx[0] < data[gp[0]].length) {
                        StringBuilder sb = new StringBuilder();
                        for (int i=0; i<n; i++) {
                            sb.append(data[gp[i]][data[gp[i]].length-subIdx[i]-1]);
                        }
                        list.add(0, sb.toString());                    subIdx[n-1]++;
                        for (int i=n-1; i>0; i--) {
                            if (subIdx[i] == data[gp[i]].length) {
                                subIdx[i] = 0;
                                subIdx[i-1]++;
                            } else {
                                break;
                            }
                        }
                    }
                }
                if (dig == n) {break;}            idx[data.length-1]++;
                for (int i=data.length-1; i>0; i--) {
                    if (idx[i] == 2) {
                        idx[i] = 0;
                        idx[i-1]++;
                    } else {
                        break;
                    }
               }
               
            }
        
            //system.out.println("n个字符串长度的结果"+????)
            int count = 0;
            for (String s : list) {
                System.out.printf("%s,", s);
                count++;
                if (count%10 == 0) {System.out.println();}
           }
           System.out.printf("\ncount=%d\n", count);
        }}
      

  4.   

    搞定了js 搞页面段的排列组合 。。借鉴别人的方法 谢谢阿宝的的热心帮助。我重新补充下问题下楼吧js贴出来 二维数组{{1,2,3},{2,3,4},{5,2,3},{1,8,9},{2,3,4}} 中组合多个n位数 .意思就是 在第一个元素中取一个数+第二个元素中一个数.....组成一个新的数字 这个数字有n位。
    例如
    n=3 就是取一个三位数把上面的数组 排列组合成125(第一个元素的1 第二个元素的2第三个元素的5组成125),122,123,121,。。124
    n=4,就是取一个四位数则是1251(第一个元素的1 第二个元素的2第三个元素的5第四个元素的1组成1251),1258,1259,1252。
      

  5.   

    我采用的方法比较笨 显示组合 二维数组的下边 组合成多个数组 然后数组中的里面元素再组合次 我只求的是组合的个数 。详细的内容我不需要去组合所以没有继续。 //************************************计算排列组合开始*****************************************
    function getnumber(n){
    var array = testsum();
    if(n==array.length){//如果用户选中当前数据行等于几串几的话 那么就是相乘
    var total_val = 1;
    var trs = $("#tab2 tbody tr");
    for(var i=0;i<trs.length;i++){
    var a = $(trs[i]).children("td").eq(3).text();
    var b = a.length==0?1:a.length;
    total_val = total_val*b;
    }
    $("#total_val").val(total_val);
    $("#filter_val").val(total_val*0.3);
    }else{//否则就用排列组合的算法
    var totalnumber = gettotalnum(array,n);
    $("#total_val").val(totalnumber);
    $("#filter_val").val(totalnumber*0.3);
    }
    }
    //获得用户选中数据的 二维数组
    function testsum(){
    var trsobj = $("#tab2 tbody tr");
    var totalarr = new Array();
    for(var i=0;i<trsobj.length;i++){
    var trobj = trsobj[i];
    var td_val = $(trobj).children("td").eq(3).text();
    td_val = td_val.replace("胜","3");
    td_val = td_val.replace("平","1");
    td_val = td_val.replace("负","0");
    var arr = new Array();
    for(var j=0;j<td_val.length;j++){
    arr[j] = td_val.charAt(j);
    }
    totalarr[i] = arr;
    }
    return totalarr;
    }
    function gettotalnum(obj,n){
    var totalnum = 0;
    var m = obj.length;
    var array = getdata(n,m);//获得排列组合 拼接成的数组
    //循环排列组合的内容
    for(var z=0;z<array.length;z++){
    var arraynum = 1;
    var str = array[z];//取到排列组合的 z个元素 遍历它
    //模拟数据 [1,2,3] str[c]=1;
    for(var c=0;c<str.length;c++){
    var index_val = str[c];
    var obj_val = obj[index_val-1];
    var obj_len = obj_val.length;
    arraynum  = arraynum*obj_len;
    }
    totalnum = totalnum + arraynum;
    }
    return totalnum;
    }
    function getdata(n,m){
       var strtotal = new Array();
       first = true;
       position = n - 1;
       set = new Array(n);
       var num = 0;
       for(var i = 0; i < n; i++){
     set[i] = i + 1;
       }
       var strtotal = new Array();
    while(hasNext(set,m)){ //当条件成立时循环
     var set = next(set,m);
     var str = new Array();
     for(var i = 0; i < set.length; i++){
    str.push(set[i]);
    num++;
     }
    strtotal.push(str);
      }
      return strtotal;
    }
    function hasNext(set,m){
    return set[0] < m - set.length + 1;
    } function next(set,m){
      if(first){
     first = false;
     return set;
      }
      if(set[set.length-1] == m){
     position--;
      }else{
     position = set.length - 1;
      }
      set[position]++;
      for(var i = position + 1; i < set.length; i++){
     set[i] = set[i-1] + 1;
      }
      return set;
    }
    //************************************计算排列组合结束*****************************************