面试题: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]