面試題 : 兩個數組合並,去掉重複的然後再排序

面試題: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]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章