[英]Merge two sorted arrays in java
我知道有類似的問題已被問及我研究了很多網站。 我試圖使用一些答案,但我的代碼仍然無法正常工作。
我正在完成以前的任務,以幫助建立我的Java知識。 請原諒我的代碼中的任何錯誤,我還在學習Java。
這是我的問題:
實現一個方法合並,給定兩個排序整數元素數組,返回一個新的排序數組,其中包含兩個輸入數組的所有元素。
假設兩個輸入數組中的元素按非遞減順序排序(例如[0,1,2,2]和[1,2,3,3,4,5])。 返回的“合並”數組必須保留此屬性(例如[0,1,1,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;
}
}
這在互聯網上的多個地方都有很好的解釋。 看看Java程序,合並兩個排序的數組 ,顯示算法的圖形說明。 您可以將您的方法更改為使用單個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;
}
嘗試為每個列表使用不同的索引。 不要將i
用於兩個列表。
從概念上講,您將從一個列表中提取項目(並為該列表增加索引)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.