我知道有人问过类似的问题,并且我已经进行了研究 许多网站。我尝试使用一些答案,但是我的代码是 仍然无法正常工作。
我正在完成以前的任务,以帮助我积累知识 Java。请原谅我的代码中的任何错误,我仍在学习 Java。
这是我的问题:
实施一种方法合并,该方法将给定两个已排序的整数元素数组,并返回一个包含两个输入数组的所有元素的新的已排序数组。
假设两个输入数组中的元素均以非降序排列(例如[0,1,2,2]和[1,2,3,3,4,5])。返回的“合并”数组必须保留此属性(例如[0,1,1,2,2,2,2,3,3,4,5])。
输入和输出中均允许重复。
如果其中一个数组为null,则将非null数组作为副本返回;如果两个数组均为null,则结果也应为null。
效率要求:阵列应在阵列上一次通过合并。
这是我到目前为止所做的事情,它不符合要求,因此我需要帮助才能找到正确的解决方案:
public class MergeArray {
public static int[] merge(int[] arr1, int[] arr2) {
if (arr1 == null && arr2 == null) {
return null;
}
if (arr1 != null & arr2 == null) {
return arr1;
}
if (arr2 != null & arr1 == null) {
return arr2;
}
int[] merged = new int [arr1.length+arr2.length];
if (arr1.length > arr2.length) {
for (int i = 0; i < arr1.length; i++) {
if (arr1[i] <= arr2[i]) {
merged[i] = arr1[i];
merged[i + 1] = arr2[i];
}
if (arr2[i] < arr1[i]) {
merged[i] = arr2[i];
merged[i + 1] = arr1[i];
}
}
if (arr1.length < arr2.length) {
for (int i = 0; i < arr2.length; i++) {
if (arr1[i] <= arr2[i]) {
merged[i] = arr1[i];
merged[i + 1] = arr2[i];
}
if (arr2[i] < arr1[i]) {
merged[i] = arr2[i];
merged[i + 1] = arr1[i];
}
}
}
}
return merged;
}
}
答案 0 :(得分:3)
这在Internet上的多个地方都有很好的解释。看一下Java program to merge two sorted arrays,它显示了该算法的图形说明。您可以将方法更改为使用单个while
循环,如下所示:
public static int[] merge(int[] arr1, int[] arr2) {
if (arr1 == null && arr2 == null) return null;
if (arr1 == null) return arr2.clone();
if (arr2 == null) return arr1.clone();
int[] result = new int[arr1.length + arr2.length];
int i = 0, j = 0, r = 0;
while (i < arr1.length && j < arr2.length) {
if (arr1[i] < arr2[j]) {
result[r] = arr1[i];
i++;
} else {
result[r] = arr2[j];
j++;
}
r++;
}
// Copy the remaining elements in array 1 to result
if (i < arr1.length) {
System.arraycopy(arr1, i, result, r, (arr1.length - i));
}
// Copy the remaining elements in array 2 to result
if (j < arr2.length) {
System.arraycopy(arr2, j, result, r, (arr2.length - j));
}
return result;
}
答案 1 :(得分:1)
如果int
数组已排序,并且您对java-8感兴趣,请在线进行
int[] arr1 = {1,2,2,3,4,4};
int[] arr2 = {4,5,5,6,7,8,8};
int[] mergedArray =Stream.concat(Arrays.stream(arr1).boxed(), Arrays.stream(arr2).boxed()).mapToInt(Integer::intValue).toArray();
System.out.println(Arrays.toString(mergedArray)); //[1, 2, 2, 3, 4, 4, 4, 5, 5, 6, 7, 8, 8]
还可以通过使用IntStream
(不需要装箱)
int[] mergArray =IntStream.concat(Arrays.stream(arr1), Arrays.stream(arr2)).toArray(); //[1, 2, 2, 3, 4, 4, 4, 5, 5, 6, 7, 8, 8]
答案 2 :(得分:0)
尝试为每个列表使用不同的索引。不要对两个列表都使用i
。
从概念上讲,您将从一个列表中拉出一个项目(并仅增加该列表的索引)。