2017-01-16 66 views
0

我有一些工作需要處理從兩個數組中添加數字。例如,如果輸入是這樣的:找到可能的最大數額

array1 
202 167 178 18 
array2 
467 15 98 3 

方案將它們配對在一起,在這種情況下,較大數量的覆蓋更小數目,這使得它們不相關的。然後它將所有大數加起來得到一筆數額。我已經解決了如何找到最小的總和,但是最大的總和似乎難度更大。正如上面的例子中,結果將是

467+202+167+178=1014 

由於他們是四個最大的數字。(對467與18,和202/167/178與任何剩下的)
我想過像

for(int n=numberofnumbers-1;n>n/2;n-=1) 
{ 
    if(array1[n]>=array2[n]) 
    { 
     anotherarray[n]=array1[n]; 
    } 
    else 
    { 
     anotherarray[n]=array2[n]; 
    } 
} 

但它會使用一個數字多於一次,輸出將不正確。我需要一些幫助,讓我可以按照自己想要的方式進行工作。

編輯:所需的輸入:

array1 
202 167 178 18 
array2 
467 15 98 3 

所需的輸出:

1014 

我與我的沒有工作的計劃得到了什麼:

1338 

編輯2:數字進行排序從另一種方法。

編輯3:尋找一些建議後,我想出了這個:

private int[] sorting(int[] dspeed,int[] pspeed) 
{ 
int[] answer=new int[dspeed.length+pspeed.length]; 
int i=0, j=0, k=0; 
while(i<dspeed.length&&j<pspeed.length) 
    answer[k++]=dspeed[i]<pspeed[j] ? dspeed[i++] : pspeed[j++]; 

while(i<dspeed.length) 
    answer[k++]=dspeed[i++]; 

while(j<pspeed.length) 
    answer[k++]=pspeed[j++]; 

return answer; 

} 

假設數組1被dspeed和數組2被pspeed,與

 final int[] ddspeed=sorting(dspeed, pspeed); 
     int answer=0; 
     for(int x=length-1;x>length/2;x--) 
     { 
      answer+=ddspeed[x]; 
     } 
     System.out.println(answer); 
     break; 

然而一直以來,我會得到答案這是沒有意義的。 例如輸入:

array1 
1 2 
array2 
1 2 

輸出

0 
+1

從您的描述中,不清楚你想完成什麼。您在描述問題和描述解決問題的方法之間交替。這將有助於通過提供樣本輸入和該輸入的樣本期望輸出來分離這兩個問題。 –

+0

@Andreas sry,顯然沒有足夠簡明的表達 – Paul

回答

0

如果我理解正確的,規則如下:

  • 配對從陣列中的號碼1與多家來自陣列2
  • 號碼只能用一次配對
  • 選擇人數最多每對
  • 琛這些數字對
  • 查找組合最大的一筆

這意味着你想要使用每個數組中最大的數字求和。最簡單的方法是對兩個數組進行排序,一個是升序,另一個是降序。現在配對索引位置。

在Java中對原始數組的排序進行排序很容易。只需使用Arrays.sort()

有沒有方法排序降序,所以你可以升序和顛倒數組,但沒有任何方法,雖然很容易爲此編寫一個方法。

我們只需按相反的順序將數字配對。

private static int highestSum(int[] array1, int[] array2) { 
    if (array1.length != array2.length) 
     throw new IllegalArgumentException(); 
    Arrays.sort(array1); 
    Arrays.sort(array2); 
    int sum = 0; 
    for (int i = 0; i < array1.length; i++) { 
     int value1 = array1[i]; 
     int value2 = array2[array2.length - i - 1]; 
     int max = Math.max(value1, value2); 
     sum += max; 
    } 
    return sum; 
} 

測試

System.out.println(highestSum(new int[] { 202, 167, 178, 18, }, 
           new int[] { 467, 15, 98, 3, })); 

輸出

1014 
0

看看這段代碼:

sum_max=0; 
for(int n=0; n<array1.length; n++) 
{ 
    if(array1[n]>=array2[n]) 
    { 
     n_max=array1[n]; 
    } 
    else 
    { 
     n_max=array2[n]; 
    } 
    sum_max += n_max; 
} 

即使我其實並沒有測試它,我認爲它應該做你想要什麼。

或者,如果你想讓它有點短:

sum_max=0; 
for(int n=0; n<array1.length; n++) 
{ 
    n_max = (array1[n]>=array2[n]) ? array1[n] : array2[n]; 
    sum_max += n_max; 
} 
+0

你的例子只是比較同一索引的值嗎?如果您看一下示例@OP想要查找兩個數組中最大4個值的總和? – shash678

+0

@ shash678你說得對,我負責這方面的工作。 – Sascha

1

要做到這一點最簡單的方法是合併兩個數組,數組排序,然後添加陣列的最後四個元素。顯然,有更好的方法可以做到這一點,但因爲我堅持了你能理解的最簡單的方法。 像這樣:

import java.util.Arrays; 

class Main { 
    public static void main(String[] args) { 
     int[] arr1 = { 202, 167, 178, 18 }; 
     int[] arr2 = { 467, 15, 98, 3 }; 
     int[] arr3 = new int[arr1.length+arr2.length]; 

     for(int i=0;i<arr1.length;i++) 
      arr3[i]=arr1[i]; 

     for(int i=0;i<arr2.length;i++) 
      arr3[arr1.length+i]=arr2[i]; 

     Arrays.sort(arr3); 

     int len = arr3.length; 

     int sum = arr3[len-1]+ arr3[len-2]+ arr3[len-3]+ arr3[len-4]; 
     System.out.println(sum); 
    } 
} 

你的想法,你可以修改它按照您的要求。

+0

Pair必須是來自每個陣列的數字。你不能從同一個數組中配對兩個數字。爲什麼你認爲有兩個數組開始? – Andreas

+0

@安德里亞斯因爲他說我們只是在尋找最大價值的總和,所以不管你是否配對,這只是解決問題的另一種方法。 –

+0

@NirajPatel如果只有在程序收到輸入後才能知道輸入長度,我該怎麼做「整數總和」部分? – Ian

0

Juust另一形式給出:排序兩個陣列。比較兩個數組中最大的數字並將其作爲總和。繼續這個沒有選擇的元素,直到你有你的配對。

sum_max=0; 
Arrays.sort(arr1); 
Arrays.sort(arr2); 
n1=array1.length-1; 
n2=n1; 
count=n1; 

while(count>=0) 
{ 
    if(array1[n1]>=array2[n2]) 
    { 
     n_max=array1[n1]; 
     n1--; 
    } 
    else 
    { 
     n_max=array2[n2]; 
     n2--; 
    } 
    sum_max += n_max; 
    count--; 
}