首页 > 解决方案 > 如果数组具有重复的元素,则在Java中进行2路合并

问题描述

所以我一直在尝试合并 2 个预排序数组并将其变成 1 个排序数组。现在预排序的数组有重复的元素。这是我所拥有的

public class TwoWayMerge {
    public void merge(int[]a,int m,int[]b,int n)
    {
        //a=50,50,50,87,88
        //b=10,20,50,89,89,120
        //m=5 length of a
        //n=6 length of b
        //c is new array
        int i=0,j=0,k=0;
        int[]c=new int[m+n];
        while(i<m && j<n && k<m+n )
        {
            if(i<m && j<n && k<m+n && a[i]<=b[j])
            {
                c[k]=a[i];
                i=i+1;
            }
            if(i<m && j<n && k<m+n && b[j]<=a[i])
            {
                c[k]=b[j];
                j=j+1;
            }
            k=k+1;
        }


        if(i==m-1)
        {
            while(j<n && k<m+n )
            {
                c[k]=b[j];
                k++;
                j++;
            }
        }
        if(j==n-1)
        {
            while(i<m && k<m+n)
            {
                c[k]=a[i];
                k++;
                i++;
            }

        }
        for(i=0;i<m+n;i++)
        {
            System.out.print(c[i]+" ");
        }

    }

    public static void main(String[] args) {

        TwoWayMerge obj=new TwoWayMerge();
        int[] a= {50,50,50,87,88};//i4
        int[] b= {10,20,50,89,89,120};//j5
        obj.merge(a,5,b,6);

    }

}

现在在这一步

a[i]<=b[j]
b[j]<=a[i]

将执行两次,我只得到 3 个“50”而不是 4 个,因为我们在两个数组中有公共元素,它们也有重复。

我的输出

10 20 50 50 50 87 88  0 0 0

预期产出

10 20 50 50 50 50 87 88 89 89 120

卡在这里,需要建议。

谢谢阅读。

标签: javaarrayssortingmerge

解决方案


在您的代码中,您到达了数组的末尾a并且您的循环终止了。

int[] a = {50, 50, 50, 87, 88};
int[] b = {10, 20, 50, 89, 89, 120};
int m = 5;
int n = 6;
int i = 0, j = 0, k;
int[] c = new int[m + n];

for (k = 0; k < m + n && i < m && j < n; k++) {
    if (a[i] <= b[j]) {
        c[k] = a[i++];
    } else {
        c[k] = b[j++];
    }
}
for (; i < m; i++) {
    c[k++] = a[i];
}
for (; j < n; j++) {
    c[k++] = b[j];
}
System.out.println(Arrays.toString(c));
// [10, 20, 50, 50, 50, 50, 87, 88, 89, 89, 120]

a您需要两个额外的循环,迭代or的剩余元素b,如果有的话。


边注:

if(i<m && j<n && k<m+n && a[i]<=b[j])

无需在这里再次检查循环条件。您可以将其简化为:

if (a[i] <= b[j])

编辑后,我可以看到您的问题非常简单:

if(j==n-1)

在这里,如果j是在第一个位置呢?

例子

a = {1, 2, 3, 4, 5};
b = {6, 7, 8, 9};

j会的0。您需要将相同的条件更改为:

if (j <= n - 1)

同样对于i


推荐阅读