Java:从输入String数组生成nCr数组并将其返回

时间:2019-10-29 02:23:58

标签: java arrays string algorithm math

我想从输入数组返回所有可能组合的完整数组。我想生成n个选择k组合,其中k = 1到n。到目前为止,我一直没有成功。

def reset(self):#reset all the values for the game
        self.confirm.grid(row=2, column=1)

        inputtext=""
        gamelabel=self.gamelabel.cget("text")

        self.gamelabel.config(text="PLEASE TYPE CONFIRM TO START THIS NEW GAME OR CANCEL TO RESUME YOUR CURRENT ONE")
        while inputtext=="":
            inputtext=self.confirm.get()
            inputtext.lower()
            if inputtext=="confirm":
                pass

            elif inputtext=="cancel":
                self.gamelabel.config(text=gamelabel)
            else:
                inputtext=""

我已经尝试了所有我能想到的和Google。从将“数据”数组传递给函数,将其与先前的自我连接起来,然后将旧数组复制到新数组,其中最新的索引是最新的“数据”,ArrayLists,Stacks,.push()、. add() ,获取可能组合的总数并将其插入到全局数组索引中...什么都没有...我很着急。当然,理想情况下,结果应类似于:

static void combinationUtil(String[] arr, String data[], int start, int end, int index, int r, float[][] info) {
        // Current combination is ready to be printed, print it
        strat newStrat = new strat(0, 0, 0, null);
        if (index == r) {
            //THIS IS WHERE THE COMBINATION I WANT APPEARS
            return;
        }

        for (int i = start; i <= end && end - i + 1 >= r - index; i++) {
            data[index] = arr[i];
            combinationUtil(arr, data, i + 1, end, index + 1, r, info);
        }
        return;
    }

public static void getCombinations(String[] arr, int n, int r, float[][] info) {
        String[] data = new String[r];
        combinationUtil(arr, data, 0, n - 1, 0, r, info);
    }

public static void main(String[] args) throws IOException, InterruptedException {
        //Array I want to get all k 1:n combinations of
        String[] array = { "TST1", "TST2", "TST3"} 
        //start a timer because that's always fun
        long startTime = System.nanoTime();
        //cycle through all 'pick k values'
        for (int i = 1; i < 8; i++) {
            getCombinations(array, n, i, info);
        }
        //Math's up. How Long did that take?
        long endTime = System.nanoTime();
        //IDEALLY PRINT THE COMBINATIONAL ARRAY HERE
        System.out.println(Arrays.deepToString(_____));
        //Don't forget to print the time ;)
        System.out.println("Duration: "+(endTime - startTime)+" ns");
    }

在这一点上甚至可以添加一点

[["TST1"], ["TST2"], ["TST3"], ["TST1", "TST2"], ["TST1", "TST3"], ["TST2", "TST3"], ["TST1", "TST2", "TST3"]

上面的代码运行良好,但组合仅出现在combinationUtil()中,而不是我要在main()中使用累积结果的位置。那么,我在做错什么呢?

1 个答案:

答案 0 :(得分:1)

您要计算大小为n的数组中r元素的可能组合。您可以尝试此代码。我将函数称为nCr(不确定这是否是我们要解决的问题的正确数学符号)

public static void main(String[] args) {
    String[] array2 = { "TST1", "TST2", "TST3"};
    List<List<String>> l = new ArrayList<>();
    for (var i: Arrays.asList(0, 1, 2, 3)) {
        l.addAll(nCr(array2, i));
    }
    System.out.println(l);
}

private static List<List<String>> nCr(String[] array, int r) {
    List<List<String>> result = new ArrayList<>();
    if (r == 0) return result;
    if (r == 1) return nC1(array);

    for (int i = 0; i < array.length - r + 1; i++) {
        List<List<String>> result2 = nCr(
                Arrays.copyOfRange(array, i + 1, array.length),
                r - 1);
        for (var x: result2 ) {
            x.add(array[i]);
            result.add(x);
        }
    }
    return result;
}

private static List<List<String>> nC1(String[] array) {
    List<List<String>> l = new ArrayList<>();
    for (var x: array) {
        l.add(new ArrayList<>(Arrays.asList(x)));
    }
    return l;
}

输出:

[[TST1], [TST2], [TST3], [TST2, TST1], [TST3, TST1], [TST3, TST2], [TST3, TST2, TST1]]