80.每日一练:移除元素(力扣)

问题描述

代码解决以及思想

解法一

cpp 复制代码
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 来记录非目标值的元素的个数。具体步骤如下:

  1. 初始化 len 为0,用于记录非目标值的元素个数。

  2. 使用迭代器 it 初始化为 nums 的开头(begin())。

  3. 进行循环,检查 it 是否等于 nums 的结束位置(end())。

  4. 在循环内部,检查 it 指向的元素是否等于给定的目标值 val

    • 如果相等,说明需要移除该元素,使用 nums.erase(it) 来移除当前元素,这会使vector的大小减小。注意,这里没有将 it 自增,因为在移除元素后,it 自动指向下一个元素。

    • 如果不相等,说明当前元素是非目标值,将 len 自增并将 it 自增,移向下一个元素。

  5. 循环结束后,len 将表示非目标值的元素个数。vector nums 中已经被修改,移除了所有值等于 val 的元素。

  6. 返回 len,表示修改后的vector的新长度。

解法二

cpp 复制代码
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;  // 返回新长度
    }
};
相关推荐
开开心心就好18 小时前
图片格式转换工具,右键菜单一键转换简化
linux·运维·服务器·python·django·pdf·1024程序员节
徐子童3 天前
网络协议---TCP协议
网络·网络协议·tcp/ip·面试题·1024程序员节
扫地的小何尚5 天前
NVIDIA RTX PC开源AI工具升级:加速LLM和扩散模型的性能革命
人工智能·python·算法·开源·nvidia·1024程序员节
数据皮皮侠AI6 天前
上市公司股票名称相似度(1990-2025)
大数据·人工智能·笔记·区块链·能源·1024程序员节
开开心心就好6 天前
系统清理工具清理缓存日志,启动卸载管理
linux·运维·服务器·神经网络·cnn·pdf·1024程序员节
Evan东少9 天前
[踩坑]笔记本Ubuntu20.04+NvidiaRTX5060驱动+cuda+Pytorch+ROS/Python实现人脸追踪(环境准备)
1024程序员节
不爱编程的小陈10 天前
C/C++每日面试题
面试·职场和发展·1024程序员节
开开心心就好10 天前
右键菜单管理工具,添加程序自定义名称位置
linux·运维·服务器·ci/cd·docker·pdf·1024程序员节
码农三叔11 天前
(4-2-05)Python SDK仓库:MCP服务器端(5)Streamable HTTP传输+Streamable HTTP传输
开发语言·python·http·大模型·1024程序员节·mcp·mcp sdk
西幻凌云15 天前
初始——正则表达式
c++·正则表达式·1024程序员节