热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Leetcode数组篇—javascript实现移除元素

移除元素题目链接:移除元素 难度:简单  题目描述:给你一个数组nums和一个值val,你需要原地移除所有数值等于val的元

移除元素

  题目链接:移除元素 难度:简单
  题目描述:给你一个数组 nums 和一个值 val,你需要原地移除所有数值等于val的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
  说明:
  为什么返回数值是整数,但输出的答案是数组呢?
  请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。
  你可以想象内部操作如下:

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

  例子&#xff1a;
在这里插入图片描述
实现思想&#xff1a;(1)暴力解法&#xff1a;首先遍历数组&#xff0c;如果发现数组中有值为val的元素&#xff0c;则将该元素之后的所有元素向前移动一位&#xff0c;覆盖住val值的元素&#xff0c;移动完成后再将数组长度减一&#xff0c;即达到删除val值元素的效果。此时我们应该继续遍历数组&#xff0c;由于第一个val值元素被删除了&#xff0c;它后面的元素都向前移动了一位&#xff0c;我们需要从移动的第一个元素开始遍历&#xff0c;所有也需要把遍历数组的下标i减一。
  例如&#xff1a;原数组为[3&#xff0c;2&#xff0c;2&#xff0c;3]&#xff0c;val为3。遍历的第一个元素与val相等&#xff0c;所以我们将后面3个元素都向前移动一位并将数组长度减一&#xff0c;结果数组是[2&#xff0c;2&#xff0c;3]。此时i&#61;1&#xff0c;但我们需要从新数组的第一个元素2开始遍历&#xff0c;而元素2的位置下标向前移动了一位&#xff0c;因此也要将i减一。
实现代码&#xff1a;

//暴力解法&#xff1a;复杂度是O(n²)
var removeElement &#61; function(nums, val) {for(let i &#61; 0;i < nums.length;i&#43;&#43;){if(nums[i] &#61;&#61; val){for(let j &#61; i &#43; 1;j < nums.length;j&#43;&#43;){nums[j - 1] &#61; nums[j]; //后面元素向前移动一位,覆盖值为val的元素}nums.length--; //数组长度减一,达到删除值为val的元素的效果i--; //元素向前移动一位,所以遍历下标也要减一}}return nums.length; //返回数值是整数,但输出的答案是数组
};

在这里插入图片描述(2)双指针法&#xff1a;右指针right指向当前将要处理的元素&#xff0c;左指针left指向下一个将要赋值的位置。最开始时left&#61;right&#61;0&#xff0c;然后两个指针都慢慢向右移动。


  • 如果右指针指向的元素不等于val&#xff0c;它一定是输出数组的一个元素&#xff0c;我们就将右指针指向的元素复制到左指针位置&#xff0c;然后将左右指针同时右移
  • 如果右指针指向的元素等于val&#xff0c;它不能在输出数组里&#xff0c;此时左指针不动&#xff0c;右指针右移一位。

整个过程保持不变的性质是&#xff1a;区间[0,left) 中的元素都不等于val。当左右指针遍历完输入数组以后&#xff0c;left的值就是输出数组的长度。
这样的算法在最坏情况下&#xff08;输入数组中没有任何元素等于val&#xff09;&#xff0c;左右指针各遍历了数组一次&#xff0c;时间复杂度为O(n)。
实现代码&#xff1a;

//双指针法,最坏情况下左右指针各遍历了数组一次
var removeElement &#61; function(nums, val) {let left &#61; 0;for(let right &#61; 0;right < nums.length;right&#43;&#43;){if(nums[right] !&#61; val){nums[left] &#61; nums[right];left&#43;&#43;;}}return left;
};

  以上双指针都是从头开始遍历的&#xff0c;最坏情况下两个指针都要完全遍历一次数组&#xff0c;另外当left&#61;right&#61;0时&#xff0c;若第一个元素的值等于val&#xff0c;则要将其他元素向前移动一位&#xff08;保证left前的元素都不为val&#xff09;&#xff0c;考虑到这种情况下较为麻烦&#xff0c;所以可以将双指针进行改进&#xff0c;使两个指针初始时分别位于数组的首尾&#xff0c;分别向中间移动遍历该序列。


  • 如果左指针left指向的元素等于val&#xff0c;此时将右指针right指向的元素复制到左指针left的位置&#xff0c;然后右指针right左移一位。如果赋值过来的元素恰好也等于val&#xff0c;可以继续把右指针right指向的元素的值赋值过来&#xff0c;直到左指针指向的元素的值不等于val为止。
  • 当左指针left和右指针right重合的时候&#xff0c;左右指针遍历完数组中所有的元素。

  这样的方法两个指针在最坏的情况下合起来只遍历了数组一次。与前一种双指针方法不同的是&#xff0c;这种两头指针避免了需要保留的元素的重复赋值操作。
实现代码&#xff1a;

//双指针法改进
var removeElement &#61; function(nums, val) {let left &#61; 0, right &#61; nums.length;while(left < right){if(nums[left] &#61;&#61; val){nums[left] &#61; nums[right-1];right--;}else{left&#43;&#43;;}//if(nums[left] !&#61; val){// left&#43;&#43;;//}else{// nums[left] &#61; nums[right-1];// right--;//}}return left;
};

推荐阅读
  • 本文详细解析了JavaScript中相称性推断的知识点,包括严厉相称和宽松相称的区别,以及范例转换的规则。针对不同类型的范例值,如差别范例值、统一类的原始范例值和统一类的复合范例值,都给出了具体的比较方法。对于宽松相称的情况,也解释了原始范例值和对象之间的比较规则。通过本文的学习,读者可以更好地理解JavaScript中相称性推断的概念和应用。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文总结了Java中日期格式化的常用方法,并给出了示例代码。通过使用SimpleDateFormat类和jstl fmt标签库,可以实现日期的格式化和显示。在页面中添加相应的标签库引用后,可以使用不同的日期格式化样式来显示当前年份和月份。该文提供了详细的代码示例和说明。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
author-avatar
幸运我是一阵风些_516
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有