面试题 : 两个数组合并,去掉重复的然后再排序

面试题:1 .两个无序数组合并, 去掉重复的然后再排序

              2 . 两个有序数组的合并排序(归并思想),Java代码实现,并去重复,考虑空间利用率问题

小积累:

  • array数组 转 list

Arrays.asList(arr数组)==>list

System.out.println("distinctAndSort = " + Arrays.toString(arr));//打印数组

  • list 转 array数组

  1. Integer[] array = list.toArray(new Integer[list.size()]);或者list.toArray(new Integer[0])//能正确运行
  2. Integer[] array = list.stream().toArray(Integer[]::new);  无参数toArray()==>Object[]
  3. 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]

发布了20 篇原创文章 · 获赞 24 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/u010565545/article/details/101783094