數組去重 三種方法 (不用集合)


第一種方法(只學到數組的看):

定義一個新的數組長度和舊數組的長度一樣,存儲除去重復數據的舊數組的數據和0,

public static void main(String[] args) {
    // 獲取一個無重復元素的數組
    int[] arr = new int[] { 11, 22, 22, 33, 44, 55, 44, 66, 66, 66 };
    // 先確定新數組的長度
    int[] newArr = new int[arr.length];

    int index = 0; // 新數組存儲元素索引(或者說無重復的個數)

    outer: for (int i = 0; i < arr.length; i++) {
        for (int j = i + 1; j < arr.length; j++) {
                     //當數據重復時,跳出外圈循環
            if (arr[i] == arr[j]) {
                continue outer;
            }
        }
        // 后面沒有與當前元素重復的值,保存這個數
        newArr[index] = arr[i];
        index++;
    }
    // 新數組中存儲着無重復的值和后面一些無效的0
    int[] result = new int[index];
    for (int i = 0; i < index; i++) { // 遍歷有效值個數
        result[i] = newArr[i];
    }
    System.out.println(Arrays.toString(result));
}

第二中方法:

 一個一個刪除,有一個刪一個. 
 把數組中的一個數據和其他數據進行比較,如果有一個重復時,就直接開始創建新數組把重復的元素去除,並重新賦給舊數組
 1    /*
 2  * 一個一個刪除,有一個刪一個. 
 3  * 把數組中的一個數據和其他數據進行比較,如果有一個重復時,就直接開始創建新數組把重復的元素去除,並重新賦給舊數組
 4  */
 5 
 6 public static void main(String[] args) {
 7 
 8     int[] arr = { 1, 1, 1, 1, 5, 3, 3, 4, 8, 8, 8, 8 };
 9 
10     for (int i = 0; i < arr.length; i++) {
11 
12         for (int j = i + 1; j < arr.length; j++) {
13 
14             if (arr[i] == arr[j]) {
15                 // return返回的數字的地址而非數組的數值(不懂的華看一下變量的 名 和所代表的數據地址的關系)
16                 arr = aa(arr, j);
17                 // 改變的數組中新數據頂替了覆蓋數組的就數據,所以還要重新比較一次
18                 /*
19                  * { 1, 1, 1, 1, 5, 3, 3, 4, 8, 8, 8, 8 }; 下標 0 1 2
20                  * 當下標為1被刪除了 ,下標2的數據補上 0 2 這個新元素還沒有被比較,所以要再比較一次,所以j--
21                  */
22                 j--;
23             }
24         }
25     }
26 
27     for (int i = 0; i < arr.length; i++) {
28         System.out.println(arr[i]);
29     }
30 
31 }
32 
33 // 需要獲得舊數組和重復元素的下標,然后改成新數組並返回出來新數組
34 public static int[] aa(int[] arr, int index) {
35 
36     // 新數組,沒發現一個就去除一個.所以長度-1 就行
37     int[] newArr = new int[arr.length - 1];
38     // 因為就數組的下標要去除一個,又不知道那個,所以定義一個變量自增來當新數組的下標
39     int c = 0;
40     for (int i = 0; i < arr.length; i++) {
41         // 判斷傳進來的那個重復的下標和數組中的下標相等時,下標的元素就不用重新賦給新數組了
42         if (index != i) {
43             newArr[c] = arr[i];
44             c++;
45         }
46     }
47 
48     return newArr;
49 }

第三種方法;

相同的一起刪除,當發現相同的元素,先統計重復的個數,然后一起刪掉,得到新數組賦給舊數組 
 1 /* 相同的一起刪除,當發現相同的元素,先統計重復的個數,然后一起刪掉,得到新數組賦給舊數組 */
 2 
 3 public static void main(String[] args) {
 4 
 5     int[] arr = { 8, 1, 1, 1, 1, 5, 3, 3, 4, 8, 8, 8, 8 };
 6 
 7     arr = a2(arr);
 8 
 9     for (int i = 0; i < arr.length; i++) {
10         System.out.println(arr[i]);
11     }
12 }
13 
14 public static int[] a2(int[] arr) {
15 
16     int a = 0;
17 
18     for (int i = 0; i < arr.length - 1; i++) {
19 
20         for (int j = i; j < arr.length - 1; j++) {
21 
22             // 如果有相同的,就統計出相同元素的個數
23             if (arr[i] == arr[j + 1]) {
24                 a += 1;
25             }
26         }
27         if (a != 0) {
28             // return返回的數字的地址而非數組的數值(不懂的華看一下變量的 名 和所代表的數據地址的關系)
29             arr = a1(arr, arr[i], a);
30             // 一個元素個數獲得到,統計變量清零,等待回去下一個元素重復的個數
31             a = 0;
32         }
33     }
34     return arr;
35 }
36 
37 // 刪除里面重復的元素
38 public static int[] a1(int[] arr, int arr2, int a) {
39     // 因為就數組的下標要去除一個,又不知道那個,所以定義一個變量自增來當新數組的下標
40     int c = 1;
41     // 獲得新數組的長度,就是舊數組減去元素重復的次數
42     int[] aa = new int[arr.length - a];
43     // 重復的元素也要保留一個
44     aa[0] = arr2;
45     for (int i = 0; i < arr.length; i++) {
46         // 不與重復元素相同的元素都非給新數組
47         if (arr2 != arr[i]) {
48             aa[c++] = arr[i];
49         }
50     }
51     return aa;
52 }

 


免責聲明!

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



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