力扣27.移除元素:使用erase删除踩的坑
我刚开始使用的是用迭代器来访问数组的每个元素
int removeElement(vector<int>& nums, int val) {
vector<int>::iterator it;
for(it=nums.begin();it!=nums.end();it++){//遍历容器每个元素
if(val==*it){//如果该元素等于要擦除的值
nums.erase(it);
}
}
return nums.size();
}
但是在leedcode上会报错显示:
我简单模拟了一下过程,会产生一下过程
以下是优化后的代码(解决了越界问题,但仍然存在多个连续等于val的元素只能删除第一个的问题)
int removeElement(vector<int>& nums, int val) {
vector<int>::iterator it;
int size=nums.size(); //存入初始长度以便后面进行动态变化
for(int i=0;i<size;i++){//表示当前访问元素下标
it=nums.begin()+i;
if(val==*it){
nums.erase(it);
size--; //每删除一次元素就要更新此时元素的值,用size=nums.size()也可以
}
}
return nums.size();
}
执行结果:(依旧还有2没有被删除)
我简单的模拟了一下这个步骤:(为了草稿简单我还是用[3,2,2,3],val=2的样例)
以下是最终优化的代码:
int removeElement(vector<int>& nums, int val) {
vector<int>::iterator it;
int size=nums.size(); //存入初始长度以便后面进行动态变化
for(int i=0;i<size;i++){//表示当前访问元素下标
it=nums.begin()+i;
if(val==*it){
nums.erase(it);
size--; //每删除一次元素就要更新此时元素的值,用size=nums.size()也可以
i--;
}
}
return nums.size();
}
可以看到已经通过了全部用例