2015-03-31 88 views
1

我有兩個排序數組arr1和arr2,我試圖將這兩個數組合併到另一個數組'output'中。 但問題是,如果第一個數組耗盡,即數組arr1被完全使用,那麼'i'的值將超過數組的長度,所以在下一次迭代時arr [i]會給出錯誤。可以做些什麼來避免這種情況?合併兩個數組時出錯

int i=0; 
    int j=0; 

    for(int k=0;k<output.length;k++) {  

      if(arr1[i]<arr2[j]) { 
       output[k]=arr1[i]; 
       i++; 
      } 


      else{   
        output[k]=arr2[j]; 
        j++;   
      }  

    } 
+0

驗證兩個陣列的長度。只有在存在的情況下才使用該值。如果(arr1.length()> i)... – Stultuske 2015-03-31 06:29:37

+0

更改你的第一條件,如果這樣的話:'if(arr1.length()> i && arr1 [i] 2015-03-31 06:37:23

+0

Thanx many guys它的工作:) – 2015-03-31 06:39:47

回答

0

您需要檢查,如果陣列已耗盡:

int i=0; 
int j=0; 

for(int k=0;k<output.length;k++) {  
    if(i < arr1.length && j < arr2.length) { 
     // both arrays still have unused elements 
     if (arr1[i]<arr2[j]) { 
      output[k]=arr1[i]; 
      i++; 
     } else {   
      output[k]=arr2[j]; 
      j++;   
     } 
    } else if (i < arr1.length) { 
     // only the first array has unused elements 
     output[k]=arr1[i]; 
     i++; 
    } else if (j < arr2.length) { 
     // only the second array has unused elements 
     output[k]=arr2[j]; 
     j++; 
    } 
} 
+0

非常感謝你eran :) – 2015-03-31 06:41:38

+0

@AkashTomar不客氣 – Eran 2015-04-01 09:55:02

0

我們可以採取的事實,即k的值沒有進行檢查,因爲輸出數組的長度相等到arr1和arr2的長度之和。一旦陣列中的元素耗盡,我們從主for循環中退出(因此,條件i < arr1.length & & j < arr2.length)。現在,由於其中一個數組已耗盡,我們只需將其他數組的所有其餘元素轉儲到輸出數組中。因此,我們檢查條件是否i!= arr1.length,如果爲true,則表示j等於arr2.length,因此arr2已用盡,並且arr1的元素必須轉儲到輸出數組中。否則,我們將其餘的arr2元素轉儲到輸出數組中。

int i=0; 
int j=0; 

for(int k=0;i<arr1.length && j < arr2.length ;k++) {  

     if(arr1[i]<arr2[j]) { 
      output[k]=arr1[i]; 
      i++; 
     } 


     else{   
       output[k]=arr2[j]; 
       j++;   
     }  

} 
if(i != arr1.length){ 
    for(; i < arr1.length; i++,k++) 
    output[k]=arr1[i]; 
} 
else{ 
    for(; j < arr2.length; j++,k++) 
    output[k]=arr2[j]; 
}