面試題:1 .兩個無序數組合並, 去掉重複的然後再排序
2 . 兩個有序數組的合併排序(歸併思想),Java代碼實現,並去重複,考慮空間利用率問題
小積累:
-
array數組 轉 list
Arrays.asList(arr數組)==>list
System.out.println("distinctAndSort = " + Arrays.toString(arr));//打印數組
-
list 轉 array數組
- Integer[] array = list.toArray(new Integer[list.size()]);或者list.toArray(new Integer[0])//能正確運行
- Integer[] array = list.stream().toArray(Integer[]::new); 無參數toArray()==>Object[]
int[] result = list.stream().mapToInt(Integer::intValue).toArray(); //IntStream==>int[]
1.無序 合併及去重和排序
方式一: 利用TreeMap putIfAbsent(a,a) key==value key唯一性去重 values()獲取集合iterator遍歷
public class TestDistinct {
private static int[] distinctAndSort(int[] arr1,int[] arr2) {
Map<Integer, Integer> map = new TreeMap<>();
for (int i : arr1) {
map.putIfAbsent(i, i);
}
for (int i : arr2) {
map.putIfAbsent(i, i);
}
Collection<Integer> values = map.values();
Iterator<Integer> it = values.iterator();
int[] arr = new int[values.size()];
int i = 0;
while (it.hasNext()) {
arr[i++] = it.next();
}
return arr;
}
public static void main(String[] args) {
int[] arr1 = new int[]{1, 42, 5, 6, 33, 22, 4, 1};
int[] arr2 = {1, 5,67,8,9,4,88, 1};
int[] ints = distinctAndSort(arr1,arr2);
System.out.println("distinctAndSort= " + Arrays.toString(ints));;
}
}
結果:
distinctAndSort = [1, 4, 5, 6, 8, 9, 22, 33, 42, 67, 88]
方式二:利用TreeSet 不允許元素重複特性
public class TestDistinct {
private static int[] distinctAndSort(int[] arr1,int[] arr2) {
TreeSet<Integer> set = new TreeSet<>();
for (int i : arr1) {
set.add(i);
}
for (int i : arr2) {
set.add(i);
}
Iterator<Integer> it = set.iterator();
int[] arr = new int[set.size()];
int i = 0;
while (it.hasNext()) {
arr[i++] = it.next();
}
return arr;
}
public static void main(String[] args) {
int[] arr1 = new int[]{1, 42, 5, 6, 33, 22, 4, 1};
int[] arr2 = {1, 5,67,8,9,4,88, 1};
int[] ints = distinctAndSort(arr1,arr2);
System.out.println("distinctAndSort= " + Arrays.toString(ints));;
}
}
結果:
distinctAndSort = [1, 4, 5, 6, 8, 9, 22, 33, 42, 67, 88]
2. 有序 合併及排序
public class TestDistinct {
public static void main(String[] args) {
int[] arr1 = {2,3,4,4,5,9,10};
int[] arr2 = {0,1,2,2,3,4,,5,6,7,7,22};
int[] result = mergeAndSort(arr1, arr2);
System.out.println("hadSorted = " + Arrays.toString(result));
}
private static int[] mergeAndSort(int[] arr1,int[] arr2) {
//創建輔助集合,其實數組創建新的數組也行,new int[A.length+arr2.length]
List<Integer> list = new ArrayList<>();
int index = 0, p1 = 0, p2 = 0;
//先將arr1或者arr2中的首個元素中的最小值添加到list
int min = arr1[p1] < arr2[p2] ? arr1[p1] : arr2[p2];
list.add(min);
//當沒有遍歷完arr1或者arr2中任意一個數組時執行
while ( p1 < arr1.length && p2 < arr2.length ) {
//拿到當前指針的最小值
int tmp = arr1[p1] < arr2[p2] ? arr1[p1++] : arr2[p2++];
//判斷list中是否已經添加了此元素
if (tmp > list.get(index)) {
list.add(tmp);
//每次添加元素後指針後移
index++;
}
}
//當arr2中元素添加完,只剩arr1中元素時
while ( p1 < arr1.length ) {
int tmp = arr1[p1++];
if (tmp > list.get(index)) {
list.add(tmp);
index++;
}
}
//當arr1中元素添加完,只剩arr2中元素時
while ( p2 < arr2.length ) {
int tmp = arr2[p2++];
if (tmp > list.get(index)) {
list.add(tmp);
index++;
}
}
//將list中元素重新移回到數組,如果剛開始創建的是數組,那麼就不用這一步了
/*int[] result = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
result[i] = list.get(i);
}*/
//Integer[] integers = list.toArray(new Integer[0]);
int[] result = list.stream().mapToInt(Integer::intValue).toArray();
return result;
}
}
結果:
hadSorted = [0, 1, 2, 3, 4, 5, 6, 7, 9, 10, 22]