2015-03-31 89 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]; 
}