java去除數組中重復的元素方法總結


/*
* ArrayUnique.java
* Version 1.0.0
* Created on 2017年12月16日
* Copyright ReYo.Cn
*/
package reyo.sdk.utils.test.array;

/**
* <B>創  建 人:</B>AdministratorReyoAut <BR>
* <B>創建時間:</B>2017年12月16日 下午3:32:23<BR>
*
* @author ReYo
* @version 1.0
*/
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

/**
 * ArrayUniue 數組去重的問題
 *
 * @author wait
 *
 */
public class ArrayUnique {
    /**
     * 方法1 就是申請一個和nums大小一樣的數組tmpNums,
     * 然后遍歷nums中的元素,對每個元素判斷是否在tmpNums出現過,
     * 如果出現過,那么就不放到新數組里面,也就是不做處理;
     * 如果沒有出現過,那么就把它放到新的數組里面
     * 這種方法數組原來的相對順序可以保證
     * 時間復雜度是n^2和空間復雜度是n
     *
     * @param nums 輸入需要去重的數組
     * @return 返回去重后數組的長度
     */
    public static int unique1(int[] nums) {
        if (nums.length == 0) {
            return 0;
        }
        int[] tmpNums = new int[nums.length];
        tmpNums[0] = nums[0];
        int index = 1;
        for (int i = 1, len = nums.length; i < len; i++) {
            int j = 0;
            for (; j < index; j++) {
                if (tmpNums[j] == nums[i]) {
                    break;
                }
            }
            if (j == index) {
                tmpNums[index++] = nums[i];
            }
        }
        nums = tmpNums;
        return index;
    }

    /**
     * 方法2 先對nums排序,排序后重復的元素一定相鄰,
     * 然后遍歷nums,並用index來表示不重復的元素應該存放的下標,
     * 如果當前遍歷的元素和他的前一個元素相等,那么他是重復的,遍歷下一個;
     * 如果不等,說明不是重復,那么當前元素存放到數組中下標為index的地方,index++
     * 這樣遍歷下來,不同的元素都放到元數組的前面去了。
     * 這種方法,得出來的是排序過得,數組原來的相對位置改變了。
     * 時間復雜度和空間復雜度都是對應排序算法的復雜度
     *
     * @param nums 輸入需要去重的數組
     * @return 返回去重后數組的長度
     */
    public static int unique2(int[] nums) {
        if (nums.length == 0) {
            return 0;
        }
        Arrays.sort(nums);
        int index = 1;
        for (int i = 1, len = nums.length; i < len; i++) {
            if (nums[i] != nums[i - 1]) {
                nums[index++] = nums[i];
            }
        }
        return index;
    }

    /**
     * 方法3 利用直接插入排序的思想,把數組分成兩部分,
     * 左邊認為是滿足要求的不重復的部分,初始為1個元素nums[0];
     * 而右邊是等待遍歷的部分,不斷遍歷右邊的元素。
     * 同樣用index來表示左邊部分不重復的元素應該存放的下標
     * 對於當前遍歷的元素,通過第二層循環遍歷左邊部分0到index的元素,
     * 如果有元素和當前元素相等,說明是重復的,那么不處理;
     * 否則,說明是不重復,那么插入到下標index的地方,index++
     * 同樣,遍歷下來,不重復的元素被放到前面部分。
     * 這種方法沒有經過排序,數組原來的相對順序可以保證。
     * 這種方法,是對方法1的改進,用本數組的前部分替代新的數組
     * 時間復雜度是n^2,空間復雜度是1
     *
     * @param nums 輸入需要去重的數組
     * @return 返回去重后數組的長度
     */
    public static int unique3(int[] nums) {
        if (nums.length == 0) {
            return 0;
        }
        int index = 1;
        for (int i = 1, len = nums.length; i < len; i++) {
            int j = 0;
            for (; j < index; j++) {
                if (nums[j] == nums[i]) {
                    break;
                }
            }
            if (j == index) {
                nums[index++] = nums[i];
            }
        }
        return index;
    }

    /**
     * 方法4 利用Java中容器來幫助判斷元素是否重復。可以使用Set Map List等
     * 這里我們利用Set容器不能存放相同的元素的特性,
     * 同樣用index來表示不重復的元素應該存放的下標
     * 當前元素如果能夠成功加入到Set容器中,說明這個元素還沒有重復的,
     * 那么當前元素就可以放到下標index的地方,index++;
     * 如果add失敗,那么說明重復了,不做操作。
     * 這種方法,同樣是把不重復的數組放到數組的前面, 並可以保證元素的相對位置不變, 不過需要額外的Set容器的空間。
     * 時間復雜度是n,空間復雜度也是n
     *
     * @param nums 輸入需要去重的數組
     * @return 返回去重后數組的長度
     */
    public static int unique4(int[] nums) {
        if (nums.length == 0) {
            return 0;
        }
        Set<Integer> set = new HashSet<Integer>();
        int index = 0;
        for (int i = 0, len = nums.length; i < len; i++) {
            if (set.add(nums[i])) {
                nums[index++] = nums[i];
            }
        }
        return index;
    }

    /**
     * printNums 打印數組的從0到length元素
     *
     * @param nums 輸入數組
     * @param length 打印長度
     */
    public static void printNums(int[] nums, int length) {
        for (int i = 0; i < length - 1; i++) {
            System.out.print(nums[i] + " ");
        }
        System.out.println(nums[length - 1]);
    }

    /**
     * main 函數
     *
     * @param args
     */
    public static void main(String[] args) {
        int[] nums = { 221, 3321, 4342, 2513, 436, 263, 2163, 44, 2351, 23261, 432, 12, 3, 123, 23, 12, 3, 2, 4, 23, 1,
                2312, 4, 33, 21, 31, 23 };
        printNums(nums, nums.length);
        int len = unique4(nums);
        printNums(nums, len);
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM