从Java中的Array中查找长度为n的组合

时间:2017-08-24 21:40:40

标签: java arrays combinations redundancy

我正在建造一个大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,22,1 而且1,12,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]);
    }

}

并且输出与之前的输出看起来相同但有更多组合和很多冗余

如何编辑上面的代码以获得没有冗余的输出?

0 个答案:

没有答案