题目
给定一个数组和一个值,在原地删除与值相同的数字,返回新数组的长度。
元素的顺序可以改变,并且对新的数组不会有影响。
样例:
给出一个数组 [0,4,4,0,0,2,4,4],和值 4
返回 4 并且4个元素的新数组为[0,0,0,2]
分析
题目要求就是要删除数组中的指定数字并且返回数组长度。
刚开始想偷懒遇到指定数字就k++,直接返回(数组长度-k),结果发现系统会测试运行完算法后数组里的元素🙃。
没办法只能按要求来了。
我后来的想法是新建一个数组B,储存值!=4的元素。但发现好像要实现将数组和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;
}
之后就想借鉴一下别人的想法,看看有没有更简便的实现。
在一篇算法博客上有个用两个指针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的数放到前面
q++;
}
p++;
}
return q;
}