java - 组合数学算法(6选2)

标签 java algorithm math combinatorics

关注此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/

相关文章:

java - 什么是NullPointerException,我该如何解决?

java - 抛出异常后如何处理 SFTP 入站适配器轮询中的剩余文件?

java - 创建游戏时出现 NullPointerException

java - 尝试启动 Activity 导致抛出异常,不确定原因

javascript - 通过原型(prototype)扩展数学对象不起作用

java - 如何确保在进行除法时不会进行整数转换?

algorithm - 面试题: Maximum multiple-sell profit

arrays - 找到 K 个乘积为 N 的数字,保持 K 个数字中的最大值为最小值

c - 将代码从 5 位数字转换为 3 个字符

c++ - 添加分数的最佳方法是什么?