今天做的LeetCode27还是蛮简单的,但是收获很大。
此题的目的就是在序列中删除指定值。
可以这么办
从头开始遍历数组
用count计数:记录这个元素在数组中出现的次数
每个元素依次向前挪动这些个单位
但感觉这个方法太笨了,转换思路,得到以下解法
用两个指针,一个负责遍历全部元素,另一个指向当前符合要求的元素,得到如下代码:
int removeElement(vector<int>& nums, int val) {
if (nums.size == 0)
return 0;
int id = 0;
for (int i = 0; i < nums.size; i++)
{
if (nums[i]!=val)
{
nums[id] = nums[i];
id++;
}
}
return id;
}
代码并不难理解,就是遇见需要去除的元素直接忽略,当得到符合条件的元素的时候用id进行标记
但题目中的要求是可以打乱元素顺序。官方给出了一种很巧妙的解决思路。利用此思路得出以下解决办法,速度比之前快很多。代码如下:
int removeElement(vector<int>& nums, int val) {
int n = nums.size();
for (int i = 0; i < n ; )
{
if (nums[i] == val)
{
nums[i] = nums[n-1];
n--;
}
else
i++;
}
return n;
}
这种方法在删除元素较少的时候速度要比前一种快很多
前一种方法适合在需要删除的元素比较多的时候使用