内容简介:Create byRecently revised in为方便小伙伴们的查看,欢迎切换到不同地址~
Create by jsliang on 2019-06-06 15:56:49
Recently revised in 2019-06-10 07:42:46
为方便小伙伴们的查看,欢迎切换到不同地址~
一 目录
不折腾的前端,和咸鱼有什么区别
目录 |
---|
二 前言
- 难度 :简单
- 涉及知识 :数组、双指针
- 题目地址 : leetcode-cn.com/problems/re…
- 题目内容 :
给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。 示例 1: 给定 nums = [3,2,2,3], val = 3, 函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。 你不需要考虑数组中超出新长度后面的元素。 示例 2: 给定 nums = [0,1,2,2,3,0,4,2], val = 2, 函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。 注意这五个元素可为任意顺序。 你不需要考虑数组中超出新长度后面的元素。 说明: 为什么返回数值是整数,但输出的答案是数组呢? 请注意,输入数组是以“引用”方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。 你可以想象内部操作如下: // nums 是以“引用”方式传递的。也就是说,不对实参作任何拷贝 int len = removeElement(nums, val); // 在函数里修改输入数组对于调用者是可见的。 // 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。 for (int i = 0; i < len; i++) { print(nums[i]); } 复制代码
三 解题
- 官方题解 :
解题千千万,官方独一家,上面是官方使用 Java 进行的题解。
小伙伴可以先自己在本地尝试解题,再看看官方解题,最后再回来看看 jsliang 讲解下使用 JavaScript 的解题思路。
3.1 解法 - 双指针
- 解题代码 :
var removeElement = function(nums, val) { for (let i = 0; i < nums.length; i++) { if (nums[i] === val) { nums.splice(i, 1); i--; } } return nums.length; }; 复制代码
- 执行测试 :
-
nums
:[0,1,2,2,3,0,4,2]
-
val
:2
-
return
:
// [ 0, 1, 3, 0, 4 ] 5 复制代码
- LeetCode Submit :
✔ Accepted ✔ 113/113 cases passed (96 ms) ✔ Your runtime beats 54.39 % of javascript submissions ✔ Your memory usage beats 95.17 % of javascript submissions (33.4 MB) 复制代码
- 知识点 :
-
splice()
:splice()
方法通过删除或替换现有元素或者原地添加新的元素来修改数组,并以数组形式返回被修改的内容。此方法会改变原数组。splice()
详细介绍
- 解题思路 :
如果小伙伴们看过上一道(第 26 题)中关于双指针的解法,那么小伙伴对这道题应该非常清晰。
如果小伙伴们没有看过上一篇的题解,建议先去接触那道题。
思路:
- 遍历整个数组
- 判断数组中的某个数字是否和需要移除的元素相等
- 如果两者相等,则移除改元素,并且遍历索引
i = i - 1
(因为splice()
改变了原数组,所以我们需要重新检查本次索引)
这样,我们就简单完成了这道题的破解。
3.2 解法 - 递归
- 解题代码 :
var removeElement = function(nums, val) { if(nums.indexOf(val) != -1) { nums.splice(nums.indexOf(val), 1); return removeElement(nums, val); } return nums.length; }; 复制代码
- 执行测试 :
-
nums
:[0,1,2,2,3,0,4,2]
-
val
:2
-
return
:
// [ 0, 1, 3, 0, 4 ] 5 复制代码
- LeetCode Submit :
✔ Accepted ✔ 113/113 cases passed (104 ms) ✔ Your runtime beats 38.48 % of javascript submissions ✔ Your memory usage beats 86.91 % of javascript submissions (33.5 MB) 复制代码
- 知识点 :
-
splice()
:splice()
方法通过删除或替换现有元素或者原地添加新的元素来修改数组,并以数组形式返回被修改的内容。此方法会改变原数组。splice()
详细介绍 -
indexOf()
:判断数组中是否存在判断条件中的值。如果存在,则返回第一次出现的索引;如果不存在,则返回 -1。indexOf()
详细介绍
- 解题思路 :
var removeElement = function(nums, val) { if(nums.indexOf(val) != -1) { nums.splice(nums.indexOf(val), 1); return removeElement(nums, val); } return nums.length; }; 复制代码
总有那么一两个破解的方式,令人眼前一亮!
虽然使用递归来破解这道题,可能比不上双指针破解法,但是感觉思路还是不错的:
首先,我们通过 indexOf()
方法来判断我们的数组中是否还存在需要移除的那个元素。在测试数据 [0,1,2,2,3,0,4,2]
和 2
的遍历中, nums,indexOf(val)
的值分别为:
2 2 5 -1 复制代码
即对应我们的 2
出现的位置。
然后,我们通过 splice()
来裁剪原数组,起始位置就是找到 2
的位置,裁剪长度就是 1 个。
最后,如果是存在移除元素,我们裁剪完后,就再执行一遍自身(递归),否则就返回最终的长度。
jsliang广告推送:
也许小伙伴想了解下云服务器
或者小伙伴想买一台云服务器
或者小伙伴需要续费云服务器
欢迎点击 云服务器推广 查看!
jsliang 的文档库 由 梁峻荣 采用 知识共享 署名-非商业性使用-相同方式共享 4.0 国际 许可协议 进行许可。
基于 github.com/LiangJunron… 上的作品创作。
本许可协议授权之外的使用权限可以从 creativecommons.org/licenses/by… 处获得。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- CSS 基础:块级元素、行内元素、替换元素、非替换元素
- CSS 技巧篇(六):display设置元素为行内元素时,元素之间存在间隙问题
- 探究行内元素和块级元素
- 重学前端:块级元素与内联元素
- 使CSS伪元素:在与主元素相同的高度之前
- 求非负元素数组所有元素能组合的最大字符串
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
微机原理与接口技术
李文英、李勤、刘星、宋蕴新 / 清华大学出版社 / 2001-9 / 26.00元
《高等院校计算机应用技术规划教材•应用型教材系列•微机原理与接口技术》是“高职高专计算机系列教材”之一。全书包括微机原理、汇编语言、接口技术三部分内容。微机原理部分讲述了80x86的内部结构及工作原理、半导体存储器及其系统、微型机总线结构等。汇编语言部分讲述了指令系统、编程技巧。接口技术部分讲述了中断系统、中断控制器、并行接口、串行接口、DMA控制器、定时器,以及A/D、D/A转换器等常用芯片的硬......一起来看看 《微机原理与接口技术》 这本书的介绍吧!