根据用户输入的高度 JAVA 获取对角线或水平线组合的总组合



我遇到了一个问题,我需要接受用户输入,并返回任意 3 个高度的所有组合,当按从最小到最大的顺序排列时,会在对角线或水平线上产生结果。例如,如果用户输入为 3 5 7 10 2 1 1 1,则输出应为

1 1 1
1 2 3
1 3 5
3 5 7

我有一些工作代码,但我的问题是获得的结果相距大于 1。到目前为止,我目前的工作代码如下。

    Arrays.sort(intArray);
    int counter = 0;
    for(int x = 0; x < intArray.length - 2; x++){
        if(intArray[x] == intArray[x+1] && intArray[x] == intArray[x+2] && intArray[x] != 0){
            validArray[counter][0] = intArray[x];
            validArray[counter][1] = intArray[x+1];
            validArray[counter][2] = intArray[x+2];
            counter++;
        }
        if(intArray[x] < intArray[x+1]){
            dif = intArray[x+1] - intArray[x];
            if(dif == intArray[x+2] - intArray[x+1]){
                validArray[counter][0] = intArray[x];
                validArray[counter][1] = intArray[x+1];
                validArray[counter][2] = intArray[x+2];
                counter++;
            }
        }
    }
    for(int x = 0; x < validArray.length; x++){
        if(validArray[x][0] != 0){
            System.out.println(validArray[x][0] + " " + validArray[x][1] + " " + validArray[x][2]);
        }
    }

如果用户输入 3 5 7 10 2 1 1 1我得到

1 1 1
1 2 3
3 5 7

而不是 1 3 5。我理解为什么我的代码没有输出正确的输出,但我不确定如何对循环结构进行编码以获得所需的输出。非常感谢有关此事的任何帮助!

我建议您使用嵌套的 for 循环评估所有可能的三元组,例如:

Arrays.sort(intArray);
final int len = intArray.length;
ArrayList<int[]> validComb = new ArrayList<int[]>();
for(int i = 0 ; i < len ; i++) {
    for(int j = i+1 ; j < len ; j++) {
        for(int k = j+1 ; k < len ; k++) {
            int[] comb = {intArray[i], intArray[j], intArray[k]};
            if(/*comb is valid*/ && /*comb is not a duplicate of another combination*/) {
                validComb.add(comb);
            }
        }
    }
}

马尔加姆解决方案的变体。检查水平线后,我们可以跳过其他相同的数字。此外,我们可以使用类中的binarySearch而不是第三个嵌套for ArraysaddLine 是一种将三元组作为参数传递添加到结果集的方法。它也不会产生重复项。

for(int x = 0; x < input.length - 2; x++) {
    if(input[x] == input[x + 1]
       && input[x] == input[x + 2]
       && input[x] != 0)
       addLine(input[x], input[x + 1], input[x + 2]);
    while(x < input.length - 1 && input[x] == input[x + 1])
       x++;
    if(x >= input.length - 2)
        break;
    for(int y = x + 1; y < input.length - 1; y++) {
        int dif = input[y] - input[x];
        int matching = binarySearch(input, y + 1,
            input.length, input[y] + dif);
        if(matching > 0)
            addLine(input[x], input[y], input[matching]);
    }
}

最新更新