LeetCode - 027 - 移除元素(remove-element)

栏目: IT技术 · 发布时间: 5年前

内容简介:LeetCode - 027 - 移除元素(remove-element)

Create by jsliang on 2019-06-06 15:56:49
Recently revised in 2019-06-06 17:12:43

一 目录

不折腾的前端,和咸鱼有什么区别

| 目录 | | --- | | 一 目录 | | 二 前言 | | 三 解题 | |  3.1 解法 - 双指针 | |  3..2 解法 - 递归 |

二 前言

  • 难度:简单

  • 涉及知识:数组、双指针

  • 题目地址:https://leetcode-cn.com/problems/remove-element/

  • 题目内容

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

  2. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。

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

  4. 示例 1:

  5. 给定 nums = [3,2,2,3], val = 3,

  6. 函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2

  7. 你不需要考虑数组中超出新长度后面的元素。

  8. 示例 2:

  9. 给定 nums = [0,1,2,2,3,0,4,2], val = 2,

  10. 函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4

  11. 注意这五个元素可为任意顺序。

  12. 你不需要考虑数组中超出新长度后面的元素。

  13. 说明:

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

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

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

  17. // nums 是以“引用”方式传递的。也就是说,不对实参作任何拷贝

  18. int len = removeElement(nums, val);

  19. // 在函数里修改输入数组对于调用者是可见的。

  20. // 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。

  21. for (int i = 0; i < len; i++) {

  22. print(nums[i]);

  23. }

三 解题

  • 官方题解

解题千千万,官方独一家,上面是官方使用 Java 进行的题解。

小伙伴可以先自己在本地尝试解题,再看看官方解题,最后再回来看看 jsliang 讲解下使用 JavaScript 的解题思路。

3.1 解法 - 双指针

  • 解题代码

  1. var removeElement = function(nums, val) {

  2. for (let i = 0; i < nums.length; i++) {

  3. if (nums[i] === val) {

  4. nums.splice(i, 1);

  5. i--;

  6. }

  7. }

  8. return nums.length;

  9. };

  • 执行测试

  1. nums: [0,1,2,2,3,0,4,2]

  2. val: 2

  3. return

  1. // [ 0, 1, 3, 0, 4 ]

  2. 5

  • LeetCode Submit

  1. Accepted

  2. 113/113 cases passed (96 ms)

  3. Your runtime beats 54.39 % of javascript submissions

  4. Your memory usage beats 95.17 % of javascript submissions (33.4 MB)

  • 知识点

  1. splice(): splice() 方法通过删除或替换现有元素或者原地添加新的元素来修改数组,并以数组形式返回被修改的内容。此方法会改变原数组。 splice() 详细介绍

  • 解题思路

如果小伙伴们看过上一道(第 26 题)中关于双指针的解法,那么小伙伴对这道题应该非常清晰。

如果小伙伴们没有看过上一篇的题解,建议先去接触那道题。

思路:

  1. 遍历整个数组

  2. 判断数组中的某个数字是否和需要移除的元素相等

  3. 如果两者相等,则移除改元素,并且遍历索引 i=i-1(因为 splice() 改变了原数组,所以我们需要重新检查本次索引)

这样,我们就简单完成了这道题的破解。

3.2 解法 - 递归

  • 解题代码

  1. var removeElement = function(nums, val) {

  2. if(nums.indexOf(val) != -1) {

  3. nums.splice(nums.indexOf(val), 1);

  4. return removeElement(nums, val);

  5. }

  6. return nums.length;

  7. };

  • 执行测试

  1. nums: [0,1,2,2,3,0,4,2]

  2. val: 2

  3. return

  1. // [ 0, 1, 3, 0, 4 ]

  2. 5

  • LeetCode Submit

  1. Accepted

  2. 113/113 cases passed (104 ms)

  3. Your runtime beats 38.48 % of javascript submissions

  4. Your memory usage beats 86.91 % of javascript submissions (33.5 MB)

  • 知识点

  1. splice(): splice() 方法通过删除或替换现有元素或者原地添加新的元素来修改数组,并以数组形式返回被修改的内容。此方法会改变原数组。 splice() 详细介绍

  2. indexOf():判断数组中是否存在判断条件中的值。如果存在,则返回第一次出现的索引;如果不存在,则返回 -1。 indexOf() 详细介绍

  • 解题思路

  1. var removeElement = function(nums, val) {

  2. if(nums.indexOf(val) != -1) {

  3. nums.splice(nums.indexOf(val), 1);

  4. return removeElement(nums, val);

  5. }

  6. return nums.length;

  7. };

总有那么一两个破解的方式,令人眼前一亮!

虽然使用递归来破解这道题,可能比不上双指针破解法,但是感觉思路还是不错的:

首先,我们通过 indexOf() 方法来判断我们的数组中是否还存在需要移除的那个元素。在测试数据 [0,1,2,2,3,0,4,2]2 的遍历中, nums,indexOf(val) 的值分别为:

  1. 2

  2. 2

  3. 5

  4. -1

即对应我们的 2 出现的位置。

然后,我们通过 splice() 来裁剪原数组,起始位置就是找到 2 的位置,裁剪长度就是 1 个。

最后,如果是存在移除元素,我们裁剪完后,就再执行一遍自身(递归),否则就返回最终的长度。


jsliang 广告推送:
也许小伙伴想了解下云服务器
或者小伙伴想买一台云服务器
或者小伙伴需要续费云服务器
欢迎点击 云服务器推广 查看!

LeetCode - 027 - 移除元素(remove-element)
jsliang 的文档库 由 梁峻荣 采用 知识共享 署名-非商业性使用-相同方式共享 4.0 国际 许可协议进行许可。
基于https://github.com/LiangJunrong/document-library上的作品创作。
本许可协议授权之外的使用权限可以从 https://creativecommons.org/licenses/by-nc-sa/2.5/cn/ 处获得。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Pro HTML5 Programming

Pro HTML5 Programming

Peter Lubbers、Brian Albers、Frank Salim / Apress / 2010-9-1 / USD 49.99

HTML5 is here, and with it, web applications take on a power, ease, scalability, and responsiveness like never before. In this book, developers will learn how to use the latest cutting-edge HTML5 web ......一起来看看 《Pro HTML5 Programming》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

MD5 加密
MD5 加密

MD5 加密工具

SHA 加密
SHA 加密

SHA 加密工具