如何从n位数字中获取n / 2位组合

时间:2019-01-03 11:10:02

标签: java combinations combinatorics

我正在努力使用这种算法。它应该像这样工作:

如果我输入f.e. 6880,我的程序应输出80 86 80 86 60 68 68。

如您所见,组合正在重复。那是因为它查看每个数字,因为它是一个不同的对象。 在我的程序中是正确的。

这是我的代码:

public static Set<Integer> get2DCombinations(List<Integer> digits) {
    Set<Integer> combinations = new TreeSet<>();

    int t = 0;
    for(Integer i : digits) {
        for (Integer j : digits) {
            t = i * 10 + j;
            if (t / 10 >= 1) {
                combinations.add(t);
            }
        }
    }

    return combinations;
}

它返回一组特定的组合,其中所有组合都有2位数字。

它可以完美工作,但只能使用4位数字。当然,我可以再使用一个for-each循环,但是有没有办法使它自动化?

因此,如果我输入6位数字,则应输出其所有可能的数字3位组合,如果输入8位数字,则应输出所有可能的4位数字组合。 输入数字始终具有偶数位数。

您能为我指出如何做到吗?

2 个答案:

答案 0 :(得分:1)

您需要一个递归程序,该程序将为您的输入生成所有组合。这是我的解决方案。我的方法接受String作为输入(这只是程序的简化,更容易,您可以根据需要进行调整):

public static Set<String> get2DCombinations(String input) {
    return backtracking("", input, input.length() / 2) ;
}

public static Set<String> backtracking(String actual, String remaining, int length) {
    if (actual.length() == length) {
        return new HashSet<>(Arrays.asList(actual));
    }

    Set<String> result = new HashSet<>();
    for(int i = 0; i < remaining.length(); i++) {
        result.addAll(backtracking(actual + remaining.charAt(i), remaining.substring(0, i) + remaining.substring(i + 1), length));
    }
    return result;
}

然后像这样调用方法:

System.out.println(get2DCombinations(input));

结果:

[88, 68, 06, 80, 08, 60, 86]

正如我在评论中提到的那样,您缺少一些组合。此解决方案会生成所有这些。

答案 1 :(得分:0)

首先尝试计算n / 2。因此,如果n为6,则n / 2 =3。那么在开始细化组合之前,您会知道要查找3位数的组合。 然后,您想找到合适的算法来找到组合。解决问题的一部分是将问题分解为较小的问题。那就是我在这里所做的。 但是,我无法为您解决此问题,因为这对您自己有更好的解决方法,其次,您没有提供详细信息,因此很难提供正确的解决方案。