27.移除元素
给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
示例 1: |
---|
给定 nums = [3,2,2,3], val = 3, 函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。 你不需要考虑数组中超出新长度后面的元素。 |
示例 2: |
---|
给定 nums = [0,1,2,2,3,0,4,2], val = 2, 函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。 注意这五个元素可为任意顺序。 你不需要考虑数组中超出新长度后面的元素。 |
傻瓜算法,遇到和val相等的数值是,整体前移覆盖该值
注意:
每移动一次,结尾就会产生一个废弃元素,可能会影响最终值。所以需要在移动时将该元素从判断列表里移除——及将for循环中i的范围值减1
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int i;
int res = 0;
if(nums.size() == 0) return 0;
for(i = 0; i < nums.size() - res; ){
if(nums[i] == val){
res ++;
for(int temp = i;temp<nums.size()-1;temp++){
nums[temp] = nums[temp+1];
}
}else{
i++;
}
}
return nums.size()-res;
}
};
leetcode上另一种C语言的算法:
跟我一开始的想法一样,但是因为不太熟练,没有写
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int j = 0;
for (int i = 0; i < nums.size(); i++) {
if (nums[i] != val) {
nums[j] = nums[i];
j++;
}
}
return j;
}
};
以及,忘记了的vector容器中的erase函数,将迭代器指向的元素直接删除,速度快到炸裂
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
for(int i=nums.size()-1;i>=0;i--)
if(nums[i]==val)
nums.erase(nums.begin()+i);
return nums.size();
}
};
Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.