代码训练LeetCode(3)移除元素

代码训练(3)LeetCode之移除元素

Author: Once Day Date: 2024年3月6日

漫漫长路,才刚刚开始…

全系列文章可参考专栏: 十年代码训练_Once-Day的博客-CSDN博客

参考文章:

  • 27. 移除元素 - 力扣(LeetCode)
  • 力扣 (LeetCode) 全球极客挚爱的技术成长平台

文章目录

      • 代码训练(3)LeetCode之移除元素
        • 1. 原题
        • 2. 分析
        • 3. 代码实现
        • 4. 总结

1. 原题

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

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

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

比如对于nums = [4, 6 , 7, 4],且val = 4,返回nums=[4, 4, x, x], return 2,最终两个数字是什么并不重要。

2. 分析

该问题是一个简单的编程题目,用C语言来实现,只要要求性能较高(速度90%),内存总是不会太高,因为原地修改。

首先,设想有一个装满不同小球的箱子,现在任务是把所有红色小球都拿出来。编程题目也是类似的,这个数组nums就像是这个箱子,而val就好比是红色小球,我们需要做的就是把所有val从数组nums中移除,并告诉别人最后箱子里还剩下多少个小球(即数组中剩余元素的个数)。

解题思路很简单,从数组的第一个元素开始,一直检查到最后一个元素,当你找到一个val时,你可以将它和数组最后一个元素交换,然后“丢弃”掉最后一个元素。这样,你就在不增加额外空间的情况下,原地修改了数组。重复这个过程,直到你检查完所有的元素。

分析步骤如下:

  1. 初始化两个指针,一个用于遍历数组(i),另一个用于记录非val元素的位置(length)。
  2. 当遍历指针i小于数组长度时,进行循环。
  3. 如果当前元素不等于val,我们就将其移动到length指定的位置,并将length加一。
  4. 如果等于val,我们就跳过它,继续检查下一个元素。
  5. 最后,length就是数组中非val元素的个数。

这里有个小例子:
假设nums = [3, 2, 2, 3]val = 3。开始时length = 0,我们逐个检查元素:

  • 第一个元素是3,等于val,跳过。
  • 第二个元素是2,不等于val,复制到nums[0]length变成1。
  • 第三个元素是2,不等于val,复制到nums[1]length变成2。
  • 第四个元素是3,等于val,跳过。

所以,新的数组是[2, 2, 2, 3],新长度是2。

性能优化关键点

  • 限制循环次数:只遍历一次数组。
  • 减少操作:当元素等于val时,跳过而不是交换,这样可以减少不必要的操作。
3. 代码实现
int removeElement(int* nums, int numsSize, int val) {
    int remain_num = 0;
    for (int i = 0; i < numsSize; i++) {
        if (nums[i] != val) {
            if (i != remain_num) {
                nums[remain_num] = nums[i];
            }
            remain_num++;
        }
    }
    return remain_num;
}

这段代码的作用是从一个整数数组中移除所有等于给定值 val 的元素,同时保持数组其他元素的顺序不变,并返回数组中移除指定元素后剩余元素的新长度。这个操作是在原数组上进行的,不需要使用额外的空间。函数执行结束后,数组中的前 remain_num 个元素是那些不等于 val 的元素,而 remain_num 是数组中剩余(未被移除)元素的数量。

运行结果如下所示,达到了预期性能目标,基本没有申请内存,但是随机性太多,仅供参考。

在这里插入图片描述

4. 总结

在面对这类数组操作问题时,能力考查的焦点通常集中在对算法的理解、编程语言的熟悉程度以及代码优化的能力上。原地修改数组意味着不能简单通过创建新数组来过滤掉不需要的元素,这就需要程序员有较强的逻辑思维能力和对语言操作数组的熟练掌握。解决这个问题,需要使用双指针技巧,其中一个指针用于遍历数组,另一个指针用于记录不等于 val 的元素应该存放的位置。

从个人提升角度来看,解决这个问题可以帮助程序员加深对数组操作的理解,提高解决类似问题的速度,尤其是在面对需要优化空间和时间复杂度的问题时。在实际工作中,这种能力是非常重要的,因为它直接关系到程序的性能和资源使用效率。

操作的理解,提高解决类似问题的速度,尤其是在面对需要优化空间和时间复杂度的问题时。在实际工作中,这种能力是非常重要的,因为它直接关系到程序的性能和资源使用效率。







Alt

Once Day

也信美人终作土,不堪幽梦太匆匆......

如果这篇文章为您带来了帮助或启发,不妨点个赞👍和关注,再加上一个小小的收藏⭐!

(。◕‿◕。)感谢您的阅读与支持~~~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu 22.04桥接wifi上网,设置静态IP

记录一下整个过程 打开虚拟网络编辑器&#xff0c;配置桥接模式到主机无线网卡&#xff0c;如图 配置虚拟机网络适配器&#xff0c;设置为桥接模式&#xff0c;勾选“复制” 打开虚拟机&#xff0c;打开终端 cd /etc/netplan目录下有 .yaml 配置文件&#xff0c;用vim编辑器打…

《MySQL实战45讲》课程大纲

1MySQL实战45讲-01基础架构&#xff1a;一条SQL查询语句是如何执行的&#xff1f;2MySQL实战45讲-02日志系统&#xff1a;一条SQL更新语句是如何执行的&#xff1f;3MySQL实战45讲-03事务隔离&#xff1a;为什么你改了我还看不见&#xff1f;4MySQL实战45讲-04深入浅出索引&…

基于云效构建部署Springboot项目到ACK

介绍 为了提高项目迭代的速度加速交付产品给客户&#xff0c;我们通常会选择CICD工具来减少人力投入产生的成本&#xff0c;开源的工具比如有成熟的Jenkins&#xff0c;但是本文讲的是阿里云提高的解决方案云效平台&#xff0c;通过配置流水线的形式实现项目的快速部署到服务器…

React-Redux简单使用

1.配置环境 1.1开启项目 npx create-react-app react-redux-pro 1.2安装配套工具 说明&#xff1a;安装Redux Toolkit和react-redux。Redux Toolkit(RTK)~官方推荐编写Redux逻辑的方式&#xff0c;是一套工具的集合集&#xff0c;简化书写方式&#xff1b;react-redux-用来…

Spring Boot 多环境配置

Spring Boot 多环境配置 在现代的软件开发中&#xff0c;通常需要将应用程序部署到不同的环境中&#xff0c;如开发环境、生产环境和测试环境等。每个环境可能需要不同的配置参数&#xff0c;例如数据库连接信息、日志级别等。在 Spring Boot 中&#xff0c;我们可以通过简单的…

Ubuntu安装conda以后,给jupyter安装C++内核

前言 大家都知道&#xff0c;jupyter notebook 可以支持python环境&#xff0c;可以在不断点调试的情况下&#xff0c;打印出当前结果&#xff0c;如果代码错了也不影响前面的内容。于是我就想有没有C环境的&#xff0c;结果还真有。 参考文章&#xff1a; 【分享】Ubuntu安装…

如何排查合并问题——《OceanBase诊断系列》之七

1. 前言 OceanBase数据库的存储引擎以 LSM-Tree 架构为基础&#xff0c;区分静态基线数据&#xff08;存储在只读SSTable&#xff09;和动态增量数据&#xff08;存储在可读写MemTable&#xff09;。其中 SSTable 是只读的&#xff0c;一旦生成就不再被修改&#xff0c;存储于…

怎么给3d模型贴图?---模大狮模型网

在3D建模软件中给模型贴图是一种常见的操作&#xff0c;可以让模型外表更加生动和具有视觉效果。 给3D模型贴图&#xff1a; 准备贴图&#xff1a;首先需要准备好你要用来贴图的纹理图片&#xff0c;确保图片符合模型的尺寸和比例。 导入贴图&#xff1a;在3D建模软件中打开模…

多模态入门

VIT处理图像 CNN VS Transformer 多模态BLIP模型 网络结构 视觉编码器: 就是 ViT 的架构。将输入图像分割成一个个的 Patch 并将它们编码为一系列 Image Embedding,并使用额外的 [CLS] token 来表示全局的图像特征。视觉编码器不采用之前的基于目标检测器的形式,因为 ViLT 和…

YOLOv9(2):YOLOv9网络结构

1. 前言 本文仅以官方提供的yolov9.yaml来进行简要讲解。 讲解之前&#xff0c;还是要做一些简单的铺垫。 Slice层不做任何的操作&#xff0c;纯粹是做一个占位层。这样一来&#xff0c;在parse_model时&#xff0c;ch[n]可表示第n层的输出通道。 Detect和DDetect主要区别还…

Media Encoder 2024:未来媒体编码的新纪元 mac/win版

随着科技的飞速发展&#xff0c;媒体内容已成为我们日常生活中不可或缺的一部分。为了满足用户对高质量视频内容不断增长的需求&#xff0c;Media Encoder 2024应运而生&#xff0c;它凭借卓越的技术和创新的特性&#xff0c;重塑了媒体编码的未来。 Media Encoder 2024软件获…

计算机的基础知识

计算机的特点及应用&#xff1a; 图灵说–计算就是基于规则的符号串变换从20世纪80年代开始&#xff0c;发达国家开始研制第五代计算机&#xff0c;研究的目标是能够打破以往计算机固有的体系结构&#xff0c;使计算机能够具有像人一样的思维、推理和判断能力&#xff0c;向智…

mysql的语法总结2

命令&#xff1a; mysql -u 用户名 -p mysql登录 命令&#xff1a;create database u1 创建数据库u1 查询数据库 使用数据库u1 创建表department 查询表department ALTER TABLE 表名 操作类型&#xff1b; 操作类型可以有以下的操作&#xff1a; 添加列&#x…

SpringMVC | SpringMVC的“入门“

目录: Spring MVC入门 :Spring MVC 概述第一个Spring MVC应用SpringMVC 的 “工作流程” Spring MVC入门 : 作者简介 &#xff1a;一只大皮卡丘&#xff0c;计算机专业学生&#xff0c;正在努力学习、努力敲代码中! 让我们一起继续努力学习&#xff01; 该文章参考学习教材为&a…

一文读懂Persistence One- 如何将Restaking带入Cosmos

Persistence One正在将Restaking引入Cosmos。用户将能够通过pSTAKE、Stride、Quicksilver和Milkyway将Liquid Staked Tokens&#xff08;如ATOM、TIA、DYDX等&#xff09;存入Persistence One&#xff0c;对其进行Restaking&#xff0c;从而安全地连接更多区块链&#xff0c;首…

计算机网络之传输层 + 应用层

.1 CIDR地址块中还有三个特殊的地址块 a. 前缀 n 32 , 即32位IP地址都是前缀, 没有主机号, 这其实就是一个IP地址, 用于主机路由 b. 前缀 n 31 , 这个地址块中有两个IP地址, 主机号分别为0/1 , 这个地址块用于点对点链路 c. 前缀 n 0 , 用于默认路由使用二叉线索树查找转发…

就业班 2401--3.7 Linux Day13--日志轮转+jumpserver堡垒机

一、日志轮转 日志重要性 Linux系统日志对管理员来说&#xff0c;是了解系统运行的主要途径&#xff0c;因此需要对 Linux 日志系统有个详细的了解。 Linux 系统内核和许多程序会产生各种错误信息、告警信息和其他的提示信息&#xff0c;这些各种信息都应该记录到日志文件中&a…

【备战蓝桥杯系列】Java组国二选手笔记一:蓝桥杯中的常用语法特性

蓝桥杯Java国二选手笔记一&#xff1a;蓝桥杯中的常用语法特性 前言 参加了好几次蓝桥杯了&#xff0c;C组参加了&#xff0c;Java也参加过&#xff0c;也会用python刷算法。下面给出常用的Java语法特性在蓝桥杯中的使用&#xff0c;以及常见的需要注意的Java语法规范。有准备…

Git你必须知道的知识

一&#xff1a;使用Git的原因 我们在写版本的时候&#xff0c;可能会谢谢改改&#xff0c;可能要回到之前的文件&#xff0c;修改之前的文件&#xff0c;因此总是要保持很多个文件&#xff0c;且书写文件名也很麻烦。git可以有一个仓库&#xff0c;版本库&#xff0c;可以保存这…

c语言经典测试题12

1.题1 float f[10]; // 假设这里有对f进行初始化的代码 for(int i 0; i < 10;) { if(f[i] 0) break; } 上述代码有那些缺陷&#xff08;&#xff09; A: for(int i 0; i < 10;)这一行写错了 B: f是float型数据直接做相等判断有风险 C: f[i]应该是f[i] D: 没有缺…