我正在建造一个大Algo。我一直试图编写一个帮助算法。
我在Interner中找到了一些很好的例子,但是所有这些例子都缺少一个小而重要的细节:
我需要编码一个方法:combine(int[] numbers, int n)
numbers
是一个唯一数字数组,例如:{1,2,3,4,5,6,7,8,9}
和n
是组合的长度,例如:n=3 -> [1,2,3] or [7,2,5]
作为该方法的简单示例:
int[] numbers = {1,2,3,4}
System.out.println(combine(numbers,2))
输出应如下所示:
1,2
1,3
1,4
2,3
2,4
3,4
非常重要的是冗余不会出现,例如:1,2
和2,1
而且1,1
或2,2
我找到的代码看起来像这样:(它不会删除冗余,这是我的问题)
public static List<int[]> combinations(int n, int[] arr) {
List<int[]> list = new ArrayList<>();
// Calculate the number of arrays we should create
int numArrays = (int)Math.pow(arr.length, n);
// Create each array
for(int i = 0; i < numArrays; i++) {
list.add(new int[n]);
}
// Fill up the arrays
for(int j = 0; j < n; j++) {
// This is the period with which this position changes, i.e.
// a period of 5 means the value changes every 5th array
int period = (int) Math.pow(arr.length, n - j - 1);
for(int i = 0; i < numArrays; i++) {
int[] current = list.get(i);
// Get the correct item and set it
int index = i / period % arr.length;
current[j] = arr[index];
}
}
return list;
}
我确实这样称呼它:
public static void main(String[] args) {
int[] current = {1,2,3,4,5,6,7,8,9};
List<int[]> s = combinations(2,current);
for(int j = 0; j < s.size(); j++) {
System.out.println(((int[])s.get(j))[0] +"," +((int[])s.get(j))[1]);
}
}
并且输出与之前的输出看起来相同但有更多组合和很多冗余
如何编辑上面的代码以获得没有冗余的输出?