

- class Solution {
- public:
- int removeElement(vector<int>& nums, int val) {
- int len = 0; // 初始化一个用于记录非目标值个数的变量
-
- // 创建一个迭代器 it,指向 nums 的开头
- vector<int>::iterator it = nums.begin();
-
- // 遍历 nums
- while (it != nums.end()) {
- if (*it == val) {
- // 如果当前元素等于目标值 val,需要将其移除
- nums.erase(it); // 使用 erase 函数移除元素
- } else {
- // 如果当前元素不等于目标值 val,增加非目标值的计数 len,并将迭代器 it 向前移动
- len++;
- it++;
- }
- }
-
- return len; // 返回新长度
- }
- };
代码的基本思想是使用一个迭代器
it遍历nums中的元素,同时使用变量len来记录非目标值的元素的个数。具体步骤如下:
初始化
len为0,用于记录非目标值的元素个数。使用迭代器
it初始化为nums的开头(begin())。进行循环,检查
it是否等于nums的结束位置(end())。在循环内部,检查
it指向的元素是否等于给定的目标值val。
如果相等,说明需要移除该元素,使用
nums.erase(it)来移除当前元素,这会使vector的大小减小。注意,这里没有将it自增,因为在移除元素后,it自动指向下一个元素。如果不相等,说明当前元素是非目标值,将
len自增并将it自增,移向下一个元素。循环结束后,
len将表示非目标值的元素个数。vectornums中已经被修改,移除了所有值等于val的元素。返回
len,表示修改后的vector的新长度。
- class Solution {
- public:
- int removeElement(vector<int>& nums, int val) {
- int left = 0; // 左指针,指向数组开头
- int right = nums.size(); // 右指针,指向数组末尾
-
- // 循环直到左指针小于右指针
- while (left < right) {
- if (nums[left] == val) {
- // 如果左指针指向的元素等于目标值 val,将左指针元素替换为右指针前面的元素
- nums[left] = nums[right - 1];
- right--; // 右指针向左移动,排除一个目标值
- } else {
- // 如果左指针指向的元素不等于目标值 val,增加左指针,继续遍历
- left++;
- }
- }
-
- return left; // 返回新长度
- }
- };