求个算法 二维数组{{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个字符串长度的结果"+????)
}
n=4,则是1231,1258,1259,1252。。 这个排列组合怎么求出公式 。public void get(String[][] str ,n){ system.out.println("n个字符串长度的结果"+????)
}
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();}
}
}
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);
}
}
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);
}}
例如
n=3 就是取一个三位数把上面的数组 排列组合成125(第一个元素的1 第二个元素的2第三个元素的5组成125),122,123,121,。。124
n=4,就是取一个四位数则是1251(第一个元素的1 第二个元素的2第三个元素的5第四个元素的1组成1251),1258,1259,1252。
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;
}
//************************************计算排列组合结束*****************************************