2016-03-03 25 views
0

我遇到了一個問題,那就是我需要接受用戶輸入,並返回從最小到最大的任意3個高度的所有組合導致對角線或水平線。例如,如果用戶輸入是3 5 7 10 2 1 1 1,則輸出應該是基於高度的用戶輸入獲取對角線或水平線組合的總組合JAVA

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。我明白爲什麼我的代碼不輸出正確的輸出,但我不知道如何去編碼我的循環結構來獲得所需的輸出。任何有關這個問題的幫助,非常感謝!

+0

你是什麼意思由「3高度」的組合?你的意思是行應該是3寬嗎?並且數字是否應該在垂直線上按升序排列(您只提及對角線和水平線)? – Maljam

+0

用戶輸入是一個高度。所以3 5 10 2 1是所有高度的可以說一個極點。使用任何3極,我需要找到所有的組合,如果你把它們按順序排列,極1,極2和極3的高度可以是a)相等,或者b)按升序排列,其中P3-P2 == P2- P1,使P1

回答

1

我建議你使用嵌套的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); 
      } 
     } 
    } 
} 
+0

謝謝,這正是我需要的!我正在艱難地環顧我的邏輯。 –

+0

@Maljam即使解決方案正確,「validComb」也只包含最後一個解決方案。 'com'是一個數組,因此插入時不會被複制。假設你插入[1,1,1]解決方案。在下一次迭代中,我們將[1,1,2]指定爲'comb'。列表中的[1,1,1]將會改變。 –

+0

@Julian,哎呀,你是對的,我試圖最大限度地提高可讀性...感謝您指出錯誤 – Maljam

1

Maljam的Varation解決方案。檢查水平線後,我們可以跳過其他相同的數字。而不是第三個嵌套for我們可以使用Arrays類的binarySearchaddLine是一種將三元作爲參數添加到結果集的方法。它也不會產生重複。

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]); 
    } 
}