原題**:
給定乙個排序陣列,在原陣列中刪除重複出現的數字,使得每個元素只出現一次,並且返回新的陣列的長度。
不要使用額外的陣列空間,必須在原地沒有額外空間的條件下完成。
您在真實的面試中是否遇到過這個題?
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);
classsolution
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**:
classsolution
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...