27.移除元素(力扣LeetCode)

news2024/12/24 21:37:44

文章目录

  • 27.移除元素(力扣LeetCode)
    • 题目描述
    • 方法一:vector成员函数:erase
    • 方法二:暴力解法
    • 方法三:双指针法

27.移除元素(力扣LeetCode)

题目描述

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

说明:

为什么返回数值是整数,但输出的答案是数组呢?

请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。

你可以想象内部操作如下:

// nums 是以“引用”方式传递的。也就是说,不对实参作任何拷贝
int len = removeElement(nums, val);
// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。
for (int i = 0; i < len; i++) {
print(nums[i]);
}

示例 1:

输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]
解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。

示例 2:

输入:nums = [0,1,2,2,3,0,4,2], val = 2
输出:5, nums = [0,1,3,0,4]
解释:函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。

提示:

  • 0 <= nums.length <= 100
  • 0 <= nums[i] <= 50
  • 0 <= val <= 100

方法一:vector成员函数:erase

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        // 循环遍历 vector 中的元素
        for(int i = 0; i < nums.size(); i++)
        {
            // 检查当前元素是否等于目标值 val
            if(nums[i] == val)
            {
                // 如果等于,使用 erase 方法移除当前位置的元素
                // nums.begin() + i 计算出当前需要删除元素的迭代器位置
                nums.erase(nums.begin() + i);
                
                // 由于元素已经被移除,后面的元素都向前移动了一个位置
                // 为了在下一次迭代中检查新移动到这个位置的元素,需要将索引 i 减去 1
                // 这样在循环的下次迭代中,i++ 将抵消这一减法操作,i 的值实际上不变
                i--;
            }
        }
        // 返回修改后的数组长度
        return nums.size();
    }
};

方法二:暴力解法

在这里插入图片描述

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        // 获取输入数组的大小
        int size = nums.size();
        
        // 遍历数组的每个元素
        for (int i = 0; i < size; i++)
        {
            // 如果当前元素等于给定的值 val
            if (nums[i] == val)
            {
                // 移动当前元素之后的元素来覆盖当前元素
                for (int j = i; j < size - 1; j++)
                    nums[j] = nums[j + 1];
                
                // 由于移除元素后数组大小减小,更新迭代变量i和数组大小size
                // i-- 是因为移除元素后,新的元素会填补到当前位置
                // 我们需要在下一次迭代中再次检查这个新的位置
                i--;
                size--;
            }
        }
        // 返回修改后数组的新长度
        return size;
    }
};

方法三:双指针法

// 定义解题类 Solution
class Solution {
public:
    // 定义 removeElement 成员函数,接受一个整数类型的 vector 引用和一个整数 val
    // vector<int>& 表示引用传递,所以对 nums 的修改将反映到原始数组上
    int removeElement(vector<int>& nums, int val) {
        // 定义一个慢指针 slow,用于跟踪在新数组中填充的位置
        int slow = 0;

        // 使用快指针 fast 遍历数组中的每个元素
        for(int fast = 0; fast < nums.size(); fast++) {
            // 检查快指针指向的当前元素是否不等于 val
            if(nums[fast] != val) {
                // 如果当前元素不等于 val,则将其复制到慢指针 slow 的位置
                // 这是因为慢指针指向的位置是用于在数组内保存不等于 val 的元素的
                nums[slow++] = nums[fast];
                // 在复制元素后,增加慢指针 slow,以便下一次找到不等于 val 的元素时
                // 可以将其放在新数组的下一个位置
            }
        }

        // 循环结束后,慢指针 slow 的值即为新数组的长度
        // 这是因为所有不等于 val 的元素都已经被复制到数组的前部
        // 并且 slow 指向了第一个未被使用的数组位置
        return slow;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1408524.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

6.php开发-个人博客项目Tp框架路由访问安全写法历史漏洞

目录 知识点 php框架——TP URL访问 Index.php-放在控制器目录下 ​编辑 Test.php--要继承一下 带参数的—————— 加入数据库代码 --不过滤 --自己写过滤 --手册&#xff08;官方&#xff09;的过滤 用TP框架找漏洞&#xff1a; 如何判断网站是thinkphp&#x…

最小二乘2D圆拟合(高斯牛顿法)

欢迎关注更多精彩 关注我&#xff0c;学习常用算法与数据结构&#xff0c;一题多解&#xff0c;降维打击。 本期话题&#xff1a;最小二乘2D圆拟合 相关背景资料 点击前往 2D圆拟合输入和输出要求 输入 8到50个点&#xff0c;全部采样自圆上&#xff0c;z轴坐标都为0。每个…

算法练习-螺旋矩阵(思路+流程图+代码)

难度参考 难度&#xff1a;中等 分类&#xff1a;数组 难度与分类由我所参与的培训课程提供&#xff0c;但需要注意的是&#xff0c;难度与分类仅供参考。以下内容均为个人笔记&#xff0c;旨在督促自己认真学习。 题目 给定一个正整数n&#xff0c;生成一个包含1到 n^2 所有元…

基于Vue+Canvas实现的画板绘画以及保存功能,解决保存没有背景问题

基于VueCanvas实现的画板绘画以及保存功能 本文内容设计到的画板的js部分内容来源于灵感来源引用地址&#xff0c;然后我在此基础上&#xff0c;根据自己的需求做了修改&#xff0c;增加了其他功能。 下面展示了完整的前后端代码 这里写目录标题 基于VueCanvas实现的画板绘…

面向对象、封装、继承、多态、JavaBean

二、面向对象 什么是对象 什么是对象&#xff1f;之前我们讲过&#xff0c;对象就是计算机中的虚拟物体。例如 System.out&#xff0c;System.in 等等。然而&#xff0c;要开发自己的应用程序&#xff0c;只有这些现成的对象还远远不够。需要我们自己来创建新的对象。 1. 抽…

confluence模版注入漏洞_CVE-2023-22527

1. 漏洞简介 Confluence是Atlassian公司开发的一款专业的企业知识管理与协同软件&#xff0c;可用于构建企业wiki。 Confluence Data Center和Confluence Server多个受影响版本中存在模板注入漏洞&#xff0c;未经身份验证的威胁者可利用该漏洞在受影响的实例上实现远程代码执…

暗藏危险,警惕钓鱼邮件!

叮 您有一份福利待查收 您的信息资产需要排查 您的账户异常需要验证 这些看似“重要”的邮件 都藏着攻击者的恶意嘴脸 随着网络安全防护和建设的重要性日益凸显&#xff0c;国家安全、企业安全、合规需求及业务驱动等各个方面都亟需将网络安全作为基石。在企业业务转型发展…

v-on、事件修饰符、v-model、一些常用指令

v-on 事件修饰符 Vue.js 为 v-on 提供了事件修饰符来处理 DOM 事件细节&#xff0c;如&#xff1a;event.preventDefault() 或 event.stopPropagation()。 Vue.js 通过由点 . 表示的指令后缀来调用修饰符。 .stop - 阻止冒泡 .prevent - 阻止默认事件 .capture - 阻止捕获 .s…

【jetson笔记】解决vscode远程调试qt.qpa.xcb: could not connect to display报错

配置x11转发 jetson远程安装x11转发 安装Xming Xming下载 安装完成后打开安装目录C:\Program Files (x86)\Xming 用记事本打开X0.hosts文件&#xff0c;添加jetson IP地址 后续IP改变需要重新修改配置文件 localhost 192.168.107.57打开Xlaunch Win菜单搜索Xlaundch打开 一…

递归和尾递归(用C语言解斐波那契和阶乘问题)

很多人都对递归有了解&#xff0c;但是为尾递归很少&#xff0c;所以这次来专门讲一讲关于尾递归的一些问题。 什么是尾递归 如果一个函数中所有递归形式的调用都出现在函数的末尾&#xff0c;我们称这个递归函数是尾递归的。因为在一些题目的做法中&#xff0c;我们可以发现…

JavaFX场景入门

目录 JAVAFX jdk1.8以上引入javafx类库 JDK11JAVAFX(eclipse) 小知识点 舞台Stage platform、screen类 Scene场景类 查看电脑屏幕宽高 Group容器 JAVAFX项目 Image javafx场景 javaFx文本 javaFX颜色 JAVAFX jdk1.8以上引入javafx类库 JDK11JAVAFX(eclipse) 方式…

MySQL分组,获取组内最新的10条数据

一、记录 记录一次SQL&#xff0c;最近在项目中遇到了一个相对比较复杂的SQL。 要求依据分组&#xff0c;获取每个分组后的前10条数据。 分组查询最新的数据&#xff0c;应该都做过&#xff0c;但是获取前10条数据&#xff0c;还是没处理过的。 二、处理 2.1 前期数据准备 …

数据分析-Pandas如何用图把数据展示出来

数据分析-Pandas如何用图把数据展示出来 俗话说&#xff0c;一图胜千语&#xff0c;对人类而言一串数据很难立即洞察出什么&#xff0c;但如果展示图就能一眼看出来门道。数据整理后&#xff0c;如何画图&#xff0c;画出好的图在数据分析中成为关键的一环。 数据表&#xff…

【进入游戏行业选游戏特效还是技术美术?】

进入游戏行业选游戏特效还是技术美术&#xff1f; 游戏行业正处于蓬勃发展的黄金时期&#xff0c;科技的进步推动了游戏技术和视觉艺术的飞速革新。在这个创意和技术挑战交织的领域里&#xff0c;游戏特效和技术美术岗位成为了许多人追求的职业目标。 这两个岗位虽然紧密关联…

5.ROC-AUC机器学习模型性能的常用的评估指标

最近回顾机器学习基础知识部分的时候&#xff0c;看到了用于评估机器学习模型性能的ROC曲线。再次记录一下&#xff0c;想起之前学习的时候的茫然&#xff0c;希望这次可以更加清晰的了解这一指标。上课的时候听老师提起过&#xff0c;当时没有认真去看&#xff0c;所以这次可以…

硅像素传感器文献调研(八)

2000硅微带探测器的物理模拟&#xff1a;电极几何形状对临界电场的影响。 2000硅微带探测器的物理模拟&#xff1a;电极几何形状对临界电场的影响 摘要 本文介绍了交流耦合硅微带探测器的计算机分析。这项研究的目的是调查的主要几何参数负责潜在的关键影响&#xff0c;如早期…

【GitHub项目推荐--多功能 Steam 工具箱】【转载】

Steam 是一个开源跨平台的多功能 Steam 工具箱&#xff0c;此工具的大部分功能都是需要下载安装 Steam 才能使用。 功能包括网络加速、脚本配置、账号切换、库存管理、自动挂卡、游戏工具&#xff0c;比如强制游戏窗口使用无边框窗口化。 开源地址&#xff1a;https://github…

c++:类和对象(5),运算符重载

目录 运算符重载概念&#xff1a; 运算符重载 1.成员函数重载号 2.全局函数重载号 打印结果&#xff1a; <<运算符重载 递增运算符重载 简单例子 输出结果为&#xff1a; 赋值运算符重载 如何重载 输出结果为&#xff1a; 什么时候重载 关系运算符重载 简单例…

【并发编程】同步模式之保护性暂停

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;并发编程 ⛺️稳中求进&#xff0c;晒太阳 同步模式之保护性暂停 这个模式用到的基础就是wait-notify 详情可以看这篇文章》:【并发编程】wait/notify 即Guarded Suspension,用在一个线…

鸿蒙开发 状态管理

最近学习鸿蒙开发。 状态管理&#xff1a; State -> Prop 单向传递&#xff1b; stateprop: State -> Prop 单向传递 State -> Link 双向传递&#xff1b;