【问题标题】:Merging two sorted arrays in java在java中合并两个排序数组
【发布时间】:2021-03-04 15:01:42
【问题描述】:
public static int[] merge(int arr1[], int arr2[]) {
    int x = arr1.length + arr2.length;
    int[] arr3= new int[x];
    x=0;
    int i =0, j=0;
    while ( i<arr1.length||j<arr2.length)
    {
        if(arr1[i]<arr2[j])
        {
            arr3[x]= arr1[i];
            i++;
            x++;
        }
        else 
        {
            arr3[x]=arr2[j];
            j++;
            x++;
        }
        
    }
    return arr3;
}

谁能解释一下这个程序有什么问题?

如果一个为空数组,如何合并数组?

例子:-

给定输入:- 1st = 5 的数组大小

1 2 3 4 5

第二个数组大小 = 0

【问题讨论】:

标签: java arrays eclipse sorting merge


【解决方案1】:

简短版:

System.arraycopy(arr, 0, arr3, 0, arr.length);
System.arraycopy(arr2, 0, arr3, arr.length, arr2.length);
return Arrays.sort(arr3);

自己实现:

也许您应该检查其中一个数组是否为空,如果某个数组比另一个数组长,还应该移动剩余部分。另外,也许您应该使用 && 而不是 ||在检查是否到达数组末尾时避免异常

 public static int[] merge(int arr1[], int arr2[]) {
    // Checking for null arrays
    if (arr1 == null){
        return arr2;
    }
    if (arr2 == null){
        return arr1;
    }
    int x = arr1.length + arr2.length;
    int[] arr3= new int[x];
    x=0;
    int i =0, j=0;
    while (i<arr1.length && j<arr2.length) // This is where your exception occurs
    {
        if(arr1[i]<arr2[j])
        {
            arr3[x]= arr1[i];
            i++;
            x++;
        }
        else
        {
            arr3[x]=arr2[j];
            j++;
            x++;
        }

    }
    // Copying leftovers
    if (i < arr1.length){
        while(i < arr1.length){
            arr3[i + j] = arr1[i];
            i++;
        }
    }
    if (j < arr2.length){
        while (j < arr2.length){
            arr3[j + i] = arr2[j];
            j++;
        }
    }
    return arr3;
}

【讨论】:

    【解决方案2】:

    让我们试运行您的程序。假设 arr1 = {2} 和 arr2 = {1, 3}。

    声明和初始化部分正确。

        //All correct here
        int x = arr1.length + arr2.length;
        int[] arr3= new int[x];
        x=0;
        int i =0, j=0;
    

    现在控制传递给循环

        while (i < arr1.length || j < arr2.length)
    

    检查第一个条件。

        if(arr1[i] < arr2[j])    //2 < 1 returns false
    

    程序控制传递给else,并执行以下所有语句。

        arr3[x]=arr2[j];
        j++;
        x++;
    

    现在在循环中的下一次 i = 0、j = 1 和 x = 1。再次记住这一点,检查 if 条件。这次它的 2

        arr3[x]= arr1[i];
        i++;
        x++;
    

    现在在循环中 i = 1、j = 1 和 x = 2 的值。问题就从这里开始。

        while (i < arr1.length || j < arr2.length) //1 < 1 || 1 < 2
                                                   //returns true
    

    检查 if 条件。

        if(arr1[i] < arr2[j])    //ArrayIndexOutOfBoundsException
    

    这是因为当 i 的值达到其长度时,您必须停止检查条件。

    在while循环中使用这个,

        if (i == arr1.length)     //if all the elements of arr1 are already checked...copy arr2 leftover elements
            arr3[x] = arr2[j++];
        else if (j == arr2.length)//if all the elements of arr2 are already checked...copy arr1 leftover elements
            arr3[x] = arr1[i++];
        else if (arr1[i] <= arr2[j])
            arr3[x] = arr1[i++];
        else 
            arr3[x] = arr2[j++];
    
        x++;
    

    对于问题的第二部分,只需检查数组是否为空。

        if (arr1 == null) return arr2;
        else if (arr2 == null) return arr1;
        else
        {
             //Perform merge
        }
    

    希望对你有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-25
      • 1970-01-01
      • 2021-10-11
      • 1970-01-01
      相关资源
      最近更新 更多