JavaScript删除排序数组中的重复项
删除排序数组中的重复项
- 前言
- 1.什么是数组
- 2.数组双指针法
- 3.LeetCode题目
- 4.解法
- 5.代码实现
- 总结
前言
1.什么是数组
所谓数组,是有序的元素序列。 若将有限个类型相同的变量的集合命名,那么这个名称为数组名。
组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。
用于区分数组的各个元素的数字编号称为下标。数组是在程序设计中,为了处理方便, 把具有相同类型的若干元素按无序的形式组织起来的一种形式。
这些无序排列的同类数据元素的集合称为数组。
数组是用于储存多个相同类型数据的集合。
2.数组双指针法
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(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],也会被视作正确答案。
思路
使用双指针法(快慢指针法):通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。
删除过程如下:
3.LeetCode题目
给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。
由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。
将最终结果插入 nums 的前 k 个位置后返回 k 。不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
实例1:
输入:nums = [1,1,2]
输出:2, nums = [1,2,_]
解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。
实例2:
输入:nums = [0,0,1,1,1,2,2,3,3,4]
输出:5, nums = [0,1,2,3,4]
解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。
4.解法
我的通俗理解:
其实可以看作一个喜新厌旧的人的一个排队列过程。这个人比较喜新厌旧,看到没有见过的数字,就把它按顺序从左到右排好,如果是已经见过的数字就直接忽略掉。 比如0 4 4 7 7 7 9 第一个数字保持不动。 然后往后面看看到第一个4,没见过,是第一次看到4,于是把它排到0的后面。 再往后看,又看到一个数字4,老面孔直接忽略掉。 再往后看看到一个数字7,是新面孔。于是把她拉到最左边,放在紧跟着0 4的位置。 再往后看是7,直接忽略,接着又是7,直接忽略。 直到看到新的数字9,然后把然后把放到0 4 7的后面。 可以理解为左边是所有的新面孔的队列,而快指针就是评审官,负责找到新面孔。
5.代码实现
<script>var removeDuplicates = function(nums) {var n = nums.length;if (n === 0) {return 0;}var left = 0;for (var right = 1; right < nums.length; right++) {if (nums[left] != nums[right]) {nums[left + 1] = nums[right];left++;}continue;}nums.splice(left + 1, right - left);return left + 1;}var t = removeDuplicates([0, 0, 1, 1, 1, 2, 2, 3, 4]);console.log(t);</script>
总结
双指针解决
使用两个指针,右指针始终往右移动,如果右指针指向的值等于左指针指向的值,左指针不动。如果右指针指向的值不等于左指针指向的值,那么左指针往右移一步,然后再把右指针指向的值赋给左指针。
JavaScript删除排序数组中的重复项相关推荐
- 【每日一算法】删除排序数组中的重复项
微信改版,加星标不迷路! 每日一算法-删除排序数组中的重复项 作者:阿广 阅读目录 ? 题目 ? 解析 ? 完整代码 1 题目 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次 ...
- LeetCode题组:第26题-删除排序数组中的重复项
1.题目:删除排序数组中的重复项 给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度.(注意这里提到了排序数组,也就是说数组是有序的.如果无序,我们又 ...
- LeetCode 25K 个一组翻转链表26删除排序数组中的重复项
如果问题或者其他方法还请分享,如加入打卡微信搜索bigsai回复进群一起打卡. K个一组翻转链表 题目要求 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表. k 是一个正整数,它的值小 ...
- leetcode初级算法1.删除排序数组中的重复项
leecode初级算法1.删除排序数组中的重复项 仅为个人刷题记录,不提供解题思路 题解与收获 class Solution {public int removeDuplicates(int[] nu ...
- vue删除数组中的一条数据_删除排序数组中的重复项 II
删除排序数组中的重复项 II题目 给定一个增序排列数组 nums ,你需要在 原地 删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在 原地 修改 ...
- 80. 删除排序数组中的重复项 II golang
80. 删除排序数组中的重复项 II 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O ...
- 26. 删除排序数组中的重复项 golang
26. 删除排序数组中的重复项 给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 ...
- [LeetCode][Python][C#]刷题记录 26. 删除排序数组中的重复项
这道题我真的纠结好久,因为没注意那个原地的题目要求,所以很奇怪怎么我电脑运行成功,但是LeetCode上运行就是不对.气哭. 感谢群友lino的帮助.他试了set方法不行,直接喂给我的答案了... 题 ...
- LeetCode--80. 删除排序数组中的重复项Ⅱ(双指针,暴力)
删除排序数组中的重复项Ⅱ(C,Python) 1. 题目描述 2. 题目分析 3. C语言实现 4. Python实现 1. 题目描述 难度:中等 2. 题目分析 这道题是LeetCode–26. 删 ...
最新文章
- 如何高效地爬取链家的房源信息(二)
- hive定时清洗至mysql_hive,sqoop定时执行脚本举例
- 程序世界的秘密(中)
- python 模拟浏览器下载文件-python爬虫:使用Selenium模拟浏览器行为
- Node.js流,这样的打开方式对不对!
- hbase 协处理器 部署_hbase中安装和删除observer协处理器
- oracle里的查询转换
- excel判断字符串包含另一个字符串_【前端冷知识】如何正确判断一个字符串是数值?...
- 【jetson nano】 aarch64安装pycharm pytorch cuda
- 报错:The type javax.servlet.http.HttpServletRequest cannot be resolved
- 华为服务器sn号查询网站,linux 查询服务器sn
- ubuntu16.04下安装opencv3.2版本
- java冒泡排序经典代码6_经典排序算法之冒泡排序
- Spring with Hibernate persistence and transactions
- 中年人需要写个遗嘱吗?
- 菜鸟也要懂点设计模式|用Python设计一个请假模式
- 关于WPF 引用字体文件无效果的相关问题
- unity蛮牛游戏API
- 使用MATLAB工具箱TOOLBOX_calib标定摄像头过程(双目标定)
- 13级计算机商务沟通与礼仪结课论文,商务沟通论文