題目
給定一個(gè)數(shù)組和一個(gè)值,在原地刪除與值相同的數(shù)字,返回新數(shù)組的長度。
元素的順序可以改變,并且對(duì)新的數(shù)組不會(huì)有影響。
樣例:
給出一個(gè)數(shù)組 [0,4,4,0,0,2,4,4],和值 4
返回 4 并且4個(gè)元素的新數(shù)組為[0,0,0,2]
分析
題目要求就是要?jiǎng)h除數(shù)組中的指定數(shù)字并且返回?cái)?shù)組長度。
剛開始想偷懶遇到指定數(shù)字就k++,直接返回(數(shù)組長度-k),結(jié)果發(fā)現(xiàn)系統(tǒng)會(huì)測(cè)試運(yùn)行完算法后數(shù)組里的元素??。
沒辦法只能按要求來了。
我后來的想法是新建一個(gè)數(shù)組B,儲(chǔ)存值!=4的元素。但發(fā)現(xiàn)好像要實(shí)現(xiàn)將數(shù)組和B替換有點(diǎn)麻煩。
↓↓↓錯(cuò)誤代碼↓↓↓
//錯(cuò)誤代碼
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);//這個(gè)用法還是錯(cuò)的/_\
return elem-k;
}
之后就想借鑒一下別人的想法,看看有沒有更簡(jiǎn)便的實(shí)現(xiàn)。
在一篇算法博客上有個(gè)用兩個(gè)指針p和q,一個(gè)指針遍歷,另一個(gè)指向指定元素,再替換元素的值。(好像沒解釋清楚,看代碼吧。。)
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;
}