输入n个数组,数组长度不等,每个数组取出一个数进行组合,求出所有的组合。
Posted xiezie
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了输入n个数组,数组长度不等,每个数组取出一个数进行组合,求出所有的组合。相关的知识,希望对你有一定的参考价值。
转载声明:原文转自http://www.cnblogs.com/xiezie/p/5511707.html
昨天晚上,有个朋友找到我,他在用matlab编程,但是遇到一个问题,解决不了。
问题如下:
输入n个数组,数组长度不等,从每个数组取出一个数进行组合,求出所有的组合。
例子:
int a[]={1,2};
int b[]={3,4,5};
可能的组合:{1,3};{1,4};{1,5};{2,3};{2,4};{2,5};
搞了40分钟左右,不辱使命~
JAVA代码实现:
import java.io.BufferedInputStream; import java.util.ArrayList; import java.util.Scanner; public class Test { public static void main(String[] args) { Scanner scanner = new Scanner(new BufferedInputStream(System.in));
//这里使用ArrayList<ArrayList<Integer>>是为了方便int数组的操作 ArrayList<ArrayList<Integer>> lists = new ArrayList<>();//若已知所以组合的具体个数可以定义容量长度--》提高性能 System.out.println("输入要所有数组的总个数:"); int n = scanner.nextInt();//数组的个数 int[] allLen = new int[n];//所有数组的长度 int index = 0; int ll = n ; while(ll--!=0){ System.out.println("输入第" + (index + 1) + "个数组的长度:"); int m = scanner.nextInt();//输入一个数组的长度 allLen[index++] = m; ArrayList<Integer> arrayList = new ArrayList<>(m); System.out.println("输入第" + index + "个数组的数据:" + "个数为\\t" + m); for(int i = 0 ; i != m ; i ++ ){ arrayList.add(scanner.nextInt()); } lists.add(arrayList); } int[] allLenProduct = new int[n];//数组的长度乘积增量 int p = 1; //组合的个数 int l = n; int index1 = 0; ArrayList<ArrayList<Integer>> results = new ArrayList<>(p); while(--l!=-1){ allLenProduct[index1] = p; p=allLen[index1++]*p; } for(int i = 0 ; i != p ; i ++ ){ ArrayList<Integer> arrayList = new ArrayList<>(n); for(int j = 0 ; j != n ; j ++){ arrayList.add(lists.get(j).get(i/allLenProduct[j]%allLen[j])); } results.add(arrayList); } int len = results.size(); System.out.println("所有的组合:"); for(int i = 0 ; i != len ; i ++ ){ ArrayList<Integer> arrayList = results.get(i); int aLen = arrayList.size(); System.out.print("\\t第\\t" + (i + 1) + "\\t行:\\t"); for(int j = 0 ; j != aLen ; j ++){ System.out.print(arrayList.get(j) + " "); } System.out.println(); } scanner.close(); } }
测试:
输入:
输入要所有数组的总个数:
4
输入第1个数组的长度:
2
输入第1个数组的数据:个数为 2
1 2
输入第2个数组的长度:
3
输入第2个数组的数据:个数为 3
4 5 6
输入第3个数组的长度:
3
输入第3个数组的数据:个数为 3
7 8 9
输入第4个数组的长度:
4
输入第4个数组的数据:个数为 4
10 11 12 13
结果:
所有的组合:
第 1 行: 1 4 7 10
第 2 行: 2 4 7 10
第 3 行: 1 5 7 10
第 4 行: 2 5 7 10
第 5 行: 1 6 7 10
第 6 行: 2 6 7 10
第 7 行: 1 4 8 10
第 8 行: 2 4 8 10
第 9 行: 1 5 8 10
第 10 行: 2 5 8 10
第 11 行: 1 6 8 10
第 12 行: 2 6 8 10
第 13 行: 1 4 9 10
第 14 行: 2 4 9 10
第 15 行: 1 5 9 10
第 16 行: 2 5 9 10
第 17 行: 1 6 9 10
第 18 行: 2 6 9 10
第 19 行: 1 4 7 11
第 20 行: 2 4 7 11
第 21 行: 1 5 7 11
第 22 行: 2 5 7 11
第 23 行: 1 6 7 11
第 24 行: 2 6 7 11
第 25 行: 1 4 8 11
第 26 行: 2 4 8 11
第 27 行: 1 5 8 11
第 28 行: 2 5 8 11
第 29 行: 1 6 8 11
第 30 行: 2 6 8 11
第 31 行: 1 4 9 11
第 32 行: 2 4 9 11
第 33 行: 1 5 9 11
第 34 行: 2 5 9 11
第 35 行: 1 6 9 11
第 36 行: 2 6 9 11
第 37 行: 1 4 7 12
第 38 行: 2 4 7 12
第 39 行: 1 5 7 12
第 40 行: 2 5 7 12
第 41 行: 1 6 7 12
第 42 行: 2 6 7 12
第 43 行: 1 4 8 12
第 44 行: 2 4 8 12
第 45 行: 1 5 8 12
第 46 行: 2 5 8 12
第 47 行: 1 6 8 12
第 48 行: 2 6 8 12
第 49 行: 1 4 9 12
第 50 行: 2 4 9 12
第 51 行: 1 5 9 12
第 52 行: 2 5 9 12
第 53 行: 1 6 9 12
第 54 行: 2 6 9 12
第 55 行: 1 4 7 13
第 56 行: 2 4 7 13
第 57 行: 1 5 7 13
第 58 行: 2 5 7 13
第 59 行: 1 6 7 13
第 60 行: 2 6 7 13
第 61 行: 1 4 8 13
第 62 行: 2 4 8 13
第 63 行: 1 5 8 13
第 64 行: 2 5 8 13
第 65 行: 1 6 8 13
第 66 行: 2 6 8 13
第 67 行: 1 4 9 13
第 68 行: 2 4 9 13
第 69 行: 1 5 9 13
第 70 行: 2 5 9 13
第 71 行: 1 6 9 13
第 72 行: 2 6 9 13
以上是关于输入n个数组,数组长度不等,每个数组取出一个数进行组合,求出所有的组合。的主要内容,如果未能解决你的问题,请参考以下文章
给定一个整数数组和一个数 k,计算每个长度为 k 的子数组的最大值