繁体   English   中英

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

[英]How to get n/2-digit combinations from n digit number

我正在努力解决这个算法。 它应该像这样工作:

如果我输入 fe 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 位数字组合。 输入数字总是偶数位数。

你能帮我指出怎么做吗?

您需要一个递归程序来为您的输入生成所有组合。 这是我的一个解决方案。 我的方法接受一个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]

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM