1. 程式人生 > >資料結構演算法題/刪除陣列中重複元素

資料結構演算法題/刪除陣列中重複元素

題目
  給定一個排序的陣列,將陣列中的重複元素去掉,相同的只保留一個,並且返回陣列新的元素個數,
不要建立一個新的陣列來儲存結果。在常量時間內解決這個問題 

解題思路
  從第二個元素開始處理,記為當前處理的元素,如果當前元素與他的前一個元素相同就刪除這個元素,
如果不同就將它移動到正確的位置,返回最後陣列元素個數。比如輸入的陣列為{1,2,3,3,4,5,5,6},
則最後的陣列為{1,2,3,4,5,6}共6個元素。
也就是index和next位置對於的元素不等的時候next往後走,相等的時候賦值並同時往後走。

public class RemoveArrDua {
    public int removeDuplicates(int[] A) {
        if (A.length == 0) {
            return 0;
        }

        int index = 0;//[0,index]記錄去重之後的陣列下標
        int next = 1;

        // 演算法思想:找index之後的比A[index]大的數,如是找到就移動到A[index+1]處,
        // index移動到下一個位置,next移動到下一個位置,再找比A[index]大的數

        while (next < A.length) {
            while (next < A.length && A[index] == A[next] ) { //找不等於A[index]的元素
                next++;
            }

            if (next < A.length) {//也就是遇到了後面不相同元素,需要index指標往後移
                //遇到第一個不相等的元素就交換
                index++;
                A[index] = A[next];
                next++;
            }
        }
        return index;
    }

    private void swap(int[] a, int x, int y) {
        int tmp = a[x];
        a[x] = a[y];
        a[y] = tmp;
    }

    public static void main(String[] args) {
        RemoveArrDua removeArrDua = new RemoveArrDua();
        int[] dataArr = {1,2,3,3,4,5,5,6};
        int newLength = removeArrDua.removeDuplicates(dataArr);
        for (int i = 0; i <= newLength; i++) {
            System.out.println(dataArr[i]);
        }
    }
}

https://blog.csdn.net/DERRANTCM/article/details/47034985