【问题标题】:Error while merging two arrays合并两个数组时出错
【发布时间】:2015-03-31 06:28:06
【问题描述】:

我有两个排序数组 arr1 和 arr2,我正在尝试将这两个数组合并到另一个数组“输出”中。 但问题是,如果第一个数组用尽,即数组 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++;         
            }       

    }

【问题讨论】:

  • 验证两个数组的长度。仅在存在时使用该值。 if ( arr1.length() > i ) ....
  • 像这样改变你的第一个 if 条件:if(arr1.length() &gt; i &amp;&amp; arr1[i]&lt;arr2[j])
  • 感谢很多人成功了 :)

标签: java mergesort


【解决方案1】:

您需要检查数组是否已用尽:

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++; 
    } 
}

【讨论】:

    【解决方案2】:

    我们可以利用这样一个事实,即不必检查 k 的值,因为输出数组的长度等于 arr1 和 arr2 的长度之和。一旦任一数组的元素耗尽,我们就退出主 for 循环(因此条件 i

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-19
      • 1970-01-01
      • 1970-01-01
      • 2011-09-25
      • 2019-10-05
      • 1970-01-01
      • 2022-08-05
      相关资源
      最近更新 更多