01、JS实现:去除数组中重复项的算法之一

数组去除重复项的算法:

  • Ⅰ、删除排序数组中的重复项(注意:是已经排好序的):
    • 1、题目描述:
    • 2、解题思路:
    • 3、实现代码:
  • Ⅳ、小结:

Ⅰ、删除排序数组中的重复项(注意:是已经排好序的):

1、题目描述:

给定⼀个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现⼀次,返回移除
后数组的新⻓度; 不要使⽤额外的数组空间,你必须在 原地 修改输⼊数组 并在使⽤ O(1) 额外空间的条件下完成。
示例 1:
给定数组 nums = [1,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。
你不需要考虑数组中超出新⻓度后⾯的元素。

2、解题思路:

使⽤快慢指针来记录遍历的坐标(我认为这是 C 的思想):
A、开始时这两个指针都指向第⼀个数字;
B、如果两个指针指的数字相同,则快指针向前⾛⼀步;
C、如果不同,则两个指针都向前⾛⼀步;
D、当快指针⾛完整个数组后,慢指针当前的坐标加 1 就是数组中不同数字的个数;
实际上这就是双指针中的快慢指针。在这⾥快指针是读指针, 慢指针是写指针。从读写指针考
虑, 我觉得更符合本质。

注意要点:
A、这道题如果不要求,O(n) 的时间复杂度, O(1) 的空间复杂度的话,会很简单。
但是这道题是要求的,这种题的思路⼀般都是采⽤双指针。
B、如果是数据是⽆序的,就不可以⽤这种⽅式了,从这⾥也可以看出排序在算法中的基础性
和重要性。
C、注意 nums 为空时的边界条件。

3、实现代码:

方式一、符合解题思路的代码与截图:

A、代码为:


// 去重函数:
var removeDuplicates = function (nums) {const size = nums.length;if (size == 0) return 0;let slowP = 0;for (let fastP = 0; fastP < size; fastP++) {if (nums[fastP] !== nums[slowP]) {slowP++;nums[slowP] = nums[fastP];}}return slowP + 1;
};// 发现此时的输出结果为:5(且此时的数组情况也是想要的结果,看方式二)
removeDuplicates([1,1,2,3,4,4,4,5])

B、截图为:
在这里插入图片描述

方式二、将非重复数组的长度及数组值输出的代码与截图:

A、代码为:


// 去重函数:
var removeDuplicates = function (nums) {const size = nums.length;if (size == 0) return 0;let slowP = 0;for (let fastP = 0; fastP < size; fastP++) {if (nums[fastP] !== nums[slowP]) {slowP++;nums[slowP] = nums[fastP];}}++slowP// 下面注释的着两种操作:都可以仅将想要的 nums 数组非重复的数据全展示出来(均已实践证实);// nums.splice(slowP)// nums = nums.splice(0,slowP)return {slowP, nums};
};// 此时的输出结果为:{"slowP": 5,"nums": [1,2,3,4,5,4,4,5]}
removeDuplicates([1,1,2,3,4,4,4,5])// 当然,倒序也是没有问题的(已实践证实);
// removeDuplicates([9,9,8,8,7,7,7,6,2,1])// 但,无序有问题(即:只支持排序数组);
// removeDuplicates([1,5,11,5,7,1,8,9,9,9,9,])
执行  removeDuplicates([1,1,2,3,4,4,4,5])  函数后代码执行的过程:nums[fastP]值     fastP值                  nums[slowP]值     slowP值1             0                           1              01             1                           2             2                           2              13             3                           3              24             4                           4              34             5                                         4             6                       5             7                           5              4

// 此时 fastP 及 slowP 的值对应的 nums 的值就是最终的数组值;
在这里插入图片描述

B、截图为:

在这里插入图片描述

在这里插入图片描述

方式三、可能存在的问题:

A、代码为:


// 去重函数:
var removeDuplicates = function (nums) {const size = nums.length;if (size == 0) return 0;let slowP = 0;// 此时若是这里 fastP < size 修改为 fastP <= size,输出的 slowP 值没问题,但 nums 数组有问题;for (let fastP = 0; fastP <= size; fastP++) {if (nums[fastP] !== nums[slowP]) {slowP++;nums[slowP] = nums[fastP];}}return {slowP, nums};
};removeDuplicates([1,1,2,3,4,4,4,5])

// 问题剖析:

执行  removeDuplicates([1,1,2,3,4,4,4,5])  函数后代码执行的过程:nums[fastP]值     fastP值                  nums[slowP]值     slowP值1             0                           1              01             1                           2             2                           2              13             3                           3              24             4                           4              34             5                                         4             6                       5             7                           5              4               undefined        8                        undefined         5

Ⅳ、小结:

其一、哪里有不对或不合适的地方,还请大佬们多多指点和交流!
其二、若有转发或引用本文章内容,请注明本博客地址(直接点击下面 url 跳转) https://blog.csdn.net/weixin_43405300,创作不易,且行且珍惜!
其三、有兴趣的话,可以多多关注这个专栏(Vue(Vue2+Vue3)面试必备专栏)(直接点击下面 url 跳转):https://blog.csdn.net/weixin_43405300/category_11525646.html?spm=1001.2014.3001.5482

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ConcurrentHashMap 为什么不能插入 null?

1、典型回答 简单来说&#xff0c;ConcurrentHashMap 不允许插入 null 值是JDK 源码规定的&#xff0c;如下源码所示(此源码基于JDK 1.8)&#xff1a; 从上述源码可以看出&#xff0c;在添加方法的第一句就加了判断&#xff1a;如果 key 值为 null 或者是 value 值为 null&…

齐聚“向上的力量”,维谛技术(Vertiv)2024年合作伙伴大会成功举办

3月13日&#xff0c;维谛技术&#xff08;Vertiv&#xff0c;NYSE&#xff1a;VRT&#xff09;2024年合作伙伴大会在广东佛山顺利召开&#xff0c;本次大会以“向上的力量”为主题&#xff0c;维谛技术与数百家优秀合作伙伴&#xff08;含港台&#xff09;欢聚一堂&#xff0c;…

vue/uniapp路由history模式下宝塔空间链接打开新窗口显示404解决方法

vue/uniapp路由history模式下宝塔空间链接打开新窗口显示404&#xff0c;或者域名后带路径参数刷新就报404 解决方法&#xff1a; 宝塔中站点配置修改&#xff1a;【配置文件】中添加下面代码&#xff0c;具体如图&#xff1a; location / {try_files $uri $uri/ /index.html…

Editor.md-编辑器

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

mac安全干净卸载Anaconda3

使用which python显示当前使用的是/Users/username/anaconda3/bin/python 现在想卸载Anaconda&#xff0c;恢复使用mac系统自带的Python 删除隐藏文件目录 rm -rf ~/.anaconda修改~/.bash_profile文件&#xff0c;将anaconda相关删除 也有可能不是~/.bash_profile而是~/.zs…

三维铁木辛柯梁Matlab有限元编程 | 弹簧支座 | 弹性支撑单元| Matlab源码 | 理论文本

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现&#xff0c;并提供所有案例完整源码&#xff1b;2.单元…

【C++】stack、queue模拟实现+仿函数

stack、queue模拟实现仿函数 stack定义stack模拟实现 queue定义queue模拟实现 priority_queue定义priority_queue模拟实现 deque定义底层分析 容器适配器定义种类 仿函数控制类里面数据的比较逻辑回调函数仿函数两者区别 铁汁们&#xff0c;今天给大家分享一篇stack、queue模拟…

移动端使用 echarts中 滚动条 dataZoom 改造为内容区域可以左右滚动

移动端使用 echarts中 滚动条 dataZoom 改造为内容区域可以左右滚动 直接上图 &#xff1a; 主要是下面这段代码&#xff1a; "dataZoom": [{"type": "inside","show": false,"xAxisIndex": [0],"zoomOnMouseWheel&…

Clickhouse 单机部署安装

前言 在大数据的时代背景下&#xff0c;数据的处理和分析能力成为企业竞争力的关键。ClickHouse&#xff0c;作为一款由俄国Yandex公司开发的分布式数据分析型数据库&#xff0c;凭借其卓越的性能和稳定性&#xff0c;赢得了业界的广泛关注。本文将介绍ClickHouse的基本概念、…

Qt/QML编程之路:基于QWidget编程及各种2D/3D/PIC绘制的示例(45)

关于使用GWidget,这里有一个示例,看了之后很多图形绘制,控件使用,及最基本的QWidget编程都比较清楚了。ui的绘制: 运行后的界面如 工程中有非常丰富的关于各种图形的绘制,比如上图中circle,还有image。有下面一段readme的说明: # EasyQPainter Various operation pra…

回到街头 - 数字时尚嘉年华:Web3的时尚未来,4月香港兰桂坊盛大启幕

随着区块链技术的不断发展&#xff0c;Web3世界正在逐渐改变我们的生活方式。作为这一变革的重要推动者&#xff0c;Vertex Labs荣幸地宣布&#xff0c;将在香港举办一场前所未有的“回到街头-数字时尚嘉年华”。这不仅是一场时尚与科技的完美结合&#xff0c;更是全球顶级IP和…

Linux arrch64系统架构 py文件运行时的编码问题解决

问题&#xff1a; 因为要测试一些东西&#xff0c;所以必须有中文数据来做支撑&#xff0c;之前用的架构是x86&#xff0c;现在一个服务器的架构为arrch64&#xff0c;下列编码都挨个都进行声明&#xff0c;但是无法解决问题&#xff0c;总是报错 # -*- coding: gbk -*- # -*…

考研数学——高数:高斯公式

助记: 关于积分时什么时候可以将变量整体代入积分式的问题&#xff1a;在积分过程中&#xff0c;如果某一整体恒为常量&#xff0c;则可以直接替换为定值&#xff0c;常见于对线或面的积分。 而在这题&#xff0c;用高斯公式之前是面积分&#xff0c;如果有这个整体出现的话是…

党费收缴管理系统(十八)关于支付total和payer_total差异的情况处理

在前面我们将支付回调通知解密获取出来的数据 &#xff0c;amount中有payer_total 和total两个值&#xff0c;正常情况下&#xff0c;这两个值应该是保持一致的。如果这两个值不一样&#xff0c;那么多半是党员缴纳过程使用了支付优惠券。 "amount":{"payer_t…

什么是VPS?如何使用VPS?

什么是VPS&#xff1f;VPS有什么用&#xff1f; VPS是Virtual Private Server的缩写&#xff0c;中文则为虚拟专用服务器&#xff0c;VPS是利用虚拟服务器软件在一台物理服务器上创建多个相互隔离的小服务器&#xff0c;是托管在机房物理服务器上的虚拟机。每个VPS服务器都可分…

Figure与OpenAI 联手推出新机器人;荣耀首款「AI PC」即将发布

▶ Figure 与 OpenAI 联手推出新机器人 AI 机器人公司 Figure 发布了他们与 OpenAI 的合作成果&#xff0c;将 OpenAI 的大模型运用在其机器人 Figure 01 上。 据介绍&#xff0c;OpenAI 大模型加持的 Figure 01 机器人现在可以与人全面对话。 OpenAI 模型为机器人提供了高级…

C# Onnx C2PNet 图像去雾 室内场景

目录 介绍 效果 模型信息 项目 代码 下载 C# Onnx C2PNet 图像去雾 室内场景 介绍 github地址&#xff1a;GitHub - YuZheng9/C2PNet: [CVPR 2023] Curricular Contrastive Regularization for Physics-aware Single Image Dehazing [CVPR 2023] Curricular Contrasti…

【蓝桥杯-单片机】基础模块:数码管

文章目录 【蓝桥杯-单片机】基础模块&#xff1a;数码管01 数码管原理图什么是位选和段选共阳极数码管和共阴极数码管的区分&#xff08;1&#xff09;共阳极数码管&#xff08;Common Anode&#xff09;&#xff1a;&#xff08;2&#xff09;共阴极数码管&#xff08;Common …

mac输入su命令报错如何重置密码

diannao1xiejiandeMacBook-Air ~ % su Password: su: Sorry输入 sudo passwd 命令重置密码即可。

【兔子机器人】实现从初始状态到站立

一、遥想星空up主的方法 由于我有卡位结构&#xff0c;无法做到劈腿&#xff0c;而且底盘也不一样&#xff0c;无法使用此方法 但是其代码思想是可以借鉴的。 参考视频&#xff1a; 【【开源啦&#xff01;】无刷轮腿平衡机器人】 【精准空降到 01:16】 https://www.bilibili…