面試常見算法1:有序數組去重

【引言】     

      本題是面試中經常被問到的算法基礎題,解決這類問題的方法也很多,常用的就是所謂的“雙指針”方法。在遇到需要對數組或者鏈表中元素進行比較時,就可以利用兩個指針遍歷數組或者鏈表來達到目的。一般而言這兩個指針可以在同一端做同向移動,也可以在兩端做相向移動,不同問題中指針移動速度也不盡相同。

【解題思路】

      對於本題,由於給定的是一個有序數組,可以直接利用雙指針來解決。方法如下:

      使用兩個下標i和j,其中i用於記錄去重後所得新數組最後一個元素的位置,j用於遍歷整個數組,i和j同向移動,通過j移動來帶動i的移動。在處理中,當遇到j和i所指向的元素值不同時,把j所指元素的值拷貝到新數組最後一個位置(i所在位置),然後將i向後移動一位。當遇到j和i所指的元素值相同時,不對i進行處理,只移動j,這樣就能保證i遍歷過得元素值各不相同。

【代碼】

    // 有序數組去重,返回新數組長度
    int removeDuplicates(int A[]) {
        int i = 0;    // 第一個指針
        int j;        // 第二個指針
        int n = A.length;
        if (n <=1 ) return n;        
        // 遍歷數組
        for (j = 1; j < n; j++) {
            if (A[j] != A[i]) { // 若兩個指針所指元素不同,則i+1位置保存j所指元素的值
                A[++i] = A[j];
            }
        }        
        return i+1;    // 返回新數組的長度
    }


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