关注此question ,我现在想编码“6选2”次“4选2”。我的意思是,假设我有 6 个字符“A B C D E F”。第一次选择任意两个字符删除。第二次我想选择 2 个不同的字母进行删除,然后附加这两次试验的结果。因此,我将收到 90(“6 选 2”乘以“4 选 2”)八个字符串。模式中的字符来自相同的模式{1,2,3,4,5,6}。所有字符都是唯一的,没有重复。
这是我目前所拥有的。
public String[] genDelPatterns(String design){
char[] data = design.toCharArray();
String[] deletionPatterns = new String[15];
int x = 0;
StringBuilder sb = new StringBuilder("");
int index = 0;
for(int i = 0; i < (6-1); i++){
for(int j = i+1; j < 6; j++){
for(int k= 0; k < 6; k++){
if((k != j) && (k != i))
sb.append(String.valueOf(data[k]));
}
deletionPatterns[x++] = sb.toString();
sb = new StringBuilder("");
}
}
return deletionPatterns;
}
public String[] gen8String(String[] pattern1, String[] pattern2){
String[] combinedPatterns = new String[225];
int k = 0;
for(int i = 0; i < 15; i++)
{
for(int j = 0; j < 15; j++)
combinedPatterns[k++] = pattern1[i] + pattern2[j];
}
return combinedPatterns;
}
我将这样调用方法:
gen8String(genDelPatterns("143256"), genDelPatterns("254316"));
目前,我正在生成所有可能的 8 字母字符串。但是我只想根据上述规范生成8个字符串。我真的很困惑如何优雅地做这个乘法。我能想到的唯一方法是制作另一种方法“4 选择 2”,然后组合 2 个字符串数组。但这似乎很迂回。
编辑: 8 个字符串的示例类似于“14322516”,考虑到我在调用 gen8String
时已经输入的输入,(143256,254316) .请注意,前 4 个字符是从 143256 派生的,删除了 5 和 6。但是因为我在第一个路径中删除了 5 和 6,所以我不再被允许在第二个模式中删除相同的东西。因此,我从第二个模式中删除了 3 和 4。
最佳答案
您有一系列方法,每个方法本身都称为变体。 为此,我的建议是使用递归方法! 要实现您的目标,您必须对这个解决方案有一点经验。
利用递归的方法的简单示例:
public static long factorial(int n) {
if (n == 1) return 1;
return n * factorial(n-1);
}
我也可以建议你为方法参数传递对象(构造完美),如果太复杂而无法传递简单的变量
在我看来,这是该解决方案的核心。
关于java - 组合数学算法(6选2),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39631251/