100 刪除排序陣列中的重複數字

2022-05-12 02:48:10 字數 1436 閱讀 8008

原題**:

給定乙個排序陣列,在原陣列中刪除重複出現的數字,使得每個元素只出現一次,並且返回新的陣列的長度。

不要使用額外的陣列空間,必須在原地沒有額外空間的條件下完成。

您在真實的面試中是否遇到過這個題? 

yes樣例給出陣列a =[1,1,2],你的函式應該返回長度2,此時a=[1,2]

標籤

兩根指標

陣列臉書

bloomberg

微軟思路1:

最開始的想法是for迴圈遍歷,迴圈變數i從size-1開始,當i大於0時:

如果當前元素與前乙個元素相等,當前元素之後的元素整體左移乙個索引,全部左移完成後,刪除最後乙個元素;

如果不相等,i--。

程式在vs2010上可以通過,但放到lintcode上現實超時……好吧,換乙個思路。

思路2:

還是for迴圈遍歷,但迴圈體內再加乙個while迴圈,找到與當前元素相等的所有元素並記錄下標範圍,然後一起刪除,這次ac了,**如下:

注意:vec.erase(vec.begin()+i,vec.begin()+j); 刪除區間[i,j-1],區間從0開始,i,j為陣列下標。

也就是說如果想刪除區間[i,j]應寫成vec.erase(vec.begin()+i,vec.begin()+j+1);

class

solution

if (i>s)

i=s;

}return (int

)nums.size();

}};

參考:vector::erase() vector中如何刪除元素?

思路3:

在網上查了查,果然能發現更好的方法,學無止境……

參考  

如何使用vector的reserve和resize方法

c++:vector中的resize()函式 vs reserve()函式

感覺有點類似於插入排序,將陣列分為兩段,前一段是已經刪除重複元素的陣列,後一段是未刪除重複元素的陣列;

用下標 i 指向非重陣列最大值(即陣列最右邊的元素),下標 j 指向重複陣列中第乙個與非重陣列中元素不同的元素;

將 j 指向的元素值賦給 i+1 指向的元素,即可增大非重陣列;

ac**:

class

solution

int i=0,j=1

;

while(jelse

}nums.resize(i+1

);

return i+1

; }

};

100 刪除排序陣列中的重複數字

容易 刪除排序陣列中的重複數字 檢視執行結果 32 通過 給定乙個排序陣列,在原陣列中刪除重複出現的數字,使得每個元素只出現一次,並且返回新的陣列的長度。不要使用額外的陣列空間,必須在原地沒有額外空間的條件下完成。您在真實的面試中是否遇到過這個題?yes 樣例給出陣列a 1,1,2 你的函式應該返回...

100 刪除排序陣列中的重複數字

5.2 題目要求是不許使用額外的空間。所以這樣寫就是錯誤的了 nums arrays.copyof nums,nums.length 1 這是建立了新的陣列。直接標記length 的長度就可以了。這個題是不需要重新維護陣列的。public class solution int i 0 for i 0...

100 刪除排序陣列中的重複數字

給定乙個排序陣列,在原陣列中刪除重複出現的數字,使得每個元素只出現一次,並且返回新的陣列的長度。不要使用額外的陣列空間,必須在原地沒有額外空間的條件下完成。樣例給出陣列a 1,1,2 你的函式應該返回長度2,此時a 1,2 這種簡單難度的題要訓練到第一時間想到解法,先上乙個醜的不行的解法 1 int...