给定一个数组,返回一个去重且有序的数组(三种方式)

package com.jn.learning.algorithm.sort;

import java.util.Arrays;
import java.util.Iterator;
import java.util.TreeSet;

/*****************************************************************************
 * *
 * Written by TankPush (Jn)
 *
 * Description: 对给定数组,其中元素有重复且无序,提供API做到返回去重且有序的数组
 * 思路1:利用TreeSet集合的特性: 去重且有序(但并非最高效,且内存占用较高)
 * 思路2:先排序,将重复元素个数获取到,开辟无重复大小新数组,将排好序数组中元素赋值给新数组后返回(使用快慢指针)
 * 思路3:先排序,然后使用快慢指针,遇到数值不相等时,慢指针向前一步slow++,将快指针处元素赋值给慢指针位置;如相等则慢指针不动
 * *
 *******************************************************************************/
public class DistinctTest1 {

    public static void main(String[] args) {

        int[] arr = {77, 6, 6, 998, 76, 887, 985, 100, 8, 87};

        int[] newArr = distinctSort(arr);
        printElem(newArr);
    }

    public static int[] distinctSort(int[] arr) {
        TreeSet<Integer> treeSet = new TreeSet<>();

        for (int i = 0; i < arr.length; i++) {
            treeSet.add(arr[i]);
        }

        int[] newArr = new int[treeSet.size()];
        int index = 0;
        Iterator<Integer> iterator = treeSet.iterator();
        while (iterator.hasNext()) {
            newArr[index++] = iterator.next();
        }
        return newArr;
    }

    public static void printElem(int[] arr) {

        System.out.print("数组中元素为:");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }

    }
}

/*
其他思路2:先排序,
         将重复元素个数获取到,开辟无重复大小新数组,
         将排好序数组中元素赋值给新数组后返回(使用快慢指针)
*/
class DistinctTest2 {

    public static void main(String[] args) {

        int[] arr = {77, 6, 6, 998, 76, 887, 985, 100, 8, 87};

        int[] newArr = distinctSort(arr);
        DistinctTest1.printElem(newArr);
    }

    public static int[] distinctSort(int[] arr) {

        Arrays.sort(arr);

        int count = 0; //记录有序数组中相邻两个元素相等的个数
        for (int i = 0; i < arr.length - 1; i++) {
            if (arr[i] == arr[i + 1]) {
                count++;
            }
        }

        int[] newArr = new int[arr.length - count];
        int index = 0;
        newArr[index] = arr[index];
        for (int i = 0; i < arr.length; i++) {
            if (newArr[index] != arr[i]) {
                newArr[++index] = arr[i];
            }
        }

        return newArr;
    }
}

/*
其他思路3:先排序,
         然后使用快慢指针,遇到数值不相等时,慢指针向前一步slow++,将快指针处元素赋值给慢指针位置;
         如相等则慢指针不动,如此方式遍历完该数组
         则该数组从索引[0,slow-1]位置的元素,有序且无重复;最后将该数组赋值给新数组返回
 */
class DistinctTest3 {

    public static void main(String[] args) {

        int[] arr = {77, 6, 6, 998, 76, 887, 985, 100, 8, 87};

        int[] newArr = distinctSort(arr);
        DistinctTest1.printElem(newArr);
    }

    public static int[] distinctSort(int[] arr) {

        Arrays.sort(arr);
        DistinctTest1.printElem(arr);
        System.out.println();

        int slow = 0;
        for (int i = 1; i < arr.length; i++) {
            if (arr[slow] != arr[i]) {
                arr[++slow] = arr[i];
            }
        }

        //将arr数组中[0,slow]范围的元素复制给新数组后返回
        int[] newArr = Arrays.copyOf(arr, slow + 1);
//        int[] newArr = new int[slow + 1];
//        System.arraycopy(arr, 0, newArr, 0, slow + 1);

        return newArr;
    }
}


你可能感兴趣的:(Java,算法)