我遇到了一个问题,我需要接受用户输入,并返回任意 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
Arrays
。 addLine
是一种将三元组作为参数传递添加到结果集的方法。它也不会产生重复项。
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]);
}
}