我正在努力使用这种算法。它应该像这样工作:
如果我输入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位数字组合。 输入数字始终具有偶数位数。
您能为我指出如何做到吗?
答案 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位数的组合。 然后,您想找到合适的算法来找到组合。解决问题的一部分是将问题分解为较小的问题。那就是我在这里所做的。 但是,我无法为您解决此问题,因为这对您自己有更好的解决方法,其次,您没有提供详细信息,因此很难提供正确的解决方案。