leetcode 27 移除元素

题目:https://leetcode-cn.com/problems/remove-element/

思路一:函数法

分析:

题目要求删掉数组厘米那的指定数值,并返回数组的长度。这里需要了解erase()函数的用法

erase函数的原型如下:
(1)string& erase ( size_t pos = 0, size_t n = npos );
(2)iterator erase ( iterator position );
(3)iterator erase ( iterator first, iterator last );
也就是说有三种用法:
(1)erase(pos,n); 删除从pos开始的n个字符,比如erase(0,1)就是删除第一个字符
(2)erase(position);删除position处的一个字符(position是个string类型的迭代器)
(3)erase(first,last);删除从first到last之间的字符(first和last都是迭代器)
erase函数可以用于删除vector容器中的一个或者一段元素,在删除一个元素的时候,其参数为指向相应元素的迭代器,而在删除一段元素的时候,参数为指向一段元素的开头的迭代器以及指向结尾元素的下一个元素的迭代器:
在进行单个元素删除后,传入的迭代器指向不变,仍然指向被删除元素的位置,而被删除元素之后的所有元素都向前移动一位,也就是该迭代器实际上是指向了原来被删除元素的下一个元素。
删除一段元素后,传入的迭代器指向也是不变的,仍然指向原来传进去时候的位置,修改的是删除段后面的元素的位置。

步骤:

  1. 定义一个变量,用于表示访问 数组元素的下标
  2. 在数组不为空的条件下循环
  3. 计算数组的长度,如果下标大于数组的长度-1。就停止循环;如果数组元素的值等于目标值,就删掉这个元素,否则就将数组元素下标+1
  4. 返回数组的长度

注意:
在这里,用erase()函数删掉一个元素后,后面元素就会向前移动一位,这时删掉元素的位置就会被后面的数组取代,所以,数组的下标在这里不要动

int removeElement(vector<int>& nums, int val) {
    
    int i = 0;
    while(!nums.empty())
    {
        int len = nums.size();
        if (i > len - 1)
        {
            break;
        }
        if (nums[i] == val)
        {
            nums.erase(nums.begin()+i);
            
        }
        else
        {
            i++;
        }
        
    }
    return nums.size();
}

写法二:利用c++ iterator就可以删除
class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int i=0;
       for (auto it = nums.begin(); it != nums.end();){
        if (val == *it) {
            it = nums.erase(it);
        }
        else {
            ++it;
        }
    }
    return nums.size();
    }
};

思路二:快慢指针法

分析:
用两个指针slowIndex 和fastIndex,开始时指向 同一个位置,如果nums[fastIndex]不等于目标值,然后进行赋值。如果等于跳过。这么做的思想是让不等于目标值的元素依次覆盖等于目标值的元素
步骤:

  1. 定义慢指针=0;

  2. 在数组元素的范围内循环

  3. 如果快指针指向 的数组元素不为目标值,则将该元素赋给慢指针指向的数组元素;(实现将目标元素覆盖);否则,快指针就跳过

int removeElement(vector<int>& nums, int val) {
       int slowIndex = 0;
       for (int fastIndex = 0; fastIndex < nums.size(); fastIndex++)
       {
              if (nums[fastIndex] != val)
              {
                     nums[slowIndex++] = nums[fastIndex];
              }
              
       }
       return slowIndex;
}

思路三:暴力解法

分析:
如果碰到一次目标元素,就将其数组迁移一位

int removeElement(vector<int>& nums, int val) {
    int size = nums.size();
    for (int i = 0; i <size ; i++)
    {
        if(nums[i]==val)
        {
           for(int j=i+1;j<size;j++)
           {
               nums[j-1]=nums[j];
           }
           size--;
           i--;
        }
        
    }
    return size;
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值