題目
給定一個數(shù)組和一個值便贵,在原地刪除與值相同的數(shù)字嘲碧,返回新數(shù)組的長度九府。
元素的順序可以改變椎瘟,并且對新的數(shù)組不會有影響。
樣例:
給出一個數(shù)組 [0,4,4,0,0,2,4,4]侄旬,和值 4
返回 4 并且4個元素的新數(shù)組為[0,0,0,2]
分析
題目要求就是要刪除數(shù)組中的指定數(shù)字并且返回數(shù)組長度肺蔚。
剛開始想偷懶遇到指定數(shù)字就k++,直接返回(數(shù)組長度-k)儡羔,結(jié)果發(fā)現(xiàn)系統(tǒng)會測試運行完算法后數(shù)組里的元素??宣羊。
沒辦法只能按要求來了璧诵。
我后來的想法是新建一個數(shù)組B,儲存值!=4的元素段只。但發(fā)現(xiàn)好像要實現(xiàn)將數(shù)組和B替換有點麻煩腮猖。
↓↓↓錯誤代碼↓↓↓
//錯誤代碼
int removeElement(vector<int> &A, int elem) {
int num=A.size();int k=0;int n=0;
vector<int> B;
for(int i=0;i<num;i++){
if(A[i]==elem)
{
k++;
}
else
{
B[n]=A[i];
n++;
}
}
A.clear();
A.swap(B);//這個用法還是錯的/_\
return elem-k;
}
之后就想借鑒一下別人的想法,看看有沒有更簡便的實現(xiàn)赞枕。
在一篇算法博客上有個用兩個指針p和q澈缺,一個指針遍歷,另一個指向指定元素炕婶,再替換元素的值姐赡。(好像沒解釋清楚,看代碼吧柠掂。项滑。)
CODE
int removeElement(vector<int> &A, int elem) {
int num=A.size();
int p,q;
p=q=0;//p用以遍歷,q用來存!=elem的元素
while(p<num){
if(A[p]!=elem){
A[q]=A[p]; //將!=elem的數(shù)放到前面
q++;
}
p++;
}
return q;
}