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.hqwc.cn/news/540339.html

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

相关文章

OJ_八皇后

题干 C实现 深度优先遍历&#xff0c;注意回溯打表法&#xff1a;先求出所有解&#xff0c;再存入一个容器中 #define _CRT_SECURE_NO_WARNINGS#include <iostream> #include <vector>using namespace std;vector<vector<int>> queenVec;//用来存在所…

基于SpringBoot+Vue的电商应用系统的设计与实现

1 绪论 1.1研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff0c;规范化管理。这样的大环境让那些止步不前&…

梵宁教育是诈骗机构吗?是否存在坑人行为

近日&#xff0c;注意到网络上出现了一些关于梵宁教育涉嫌诈骗及虚假宣传的言论&#xff0c;这些言论严重损害了梵宁教育的声誉和形象。在此&#xff0c;我们郑重声明&#xff1a;梵宁教育始终坚守诚信原则&#xff0c;从未进行过任何诈骗或虚假宣传行为。 梵宁教育自成立以来&…

损失函数和反向传播

1. 损失函数的基础 import torch from torch.nn import L1Loss from torch import nninputs torch.tensor([1, 2, 3], dtypetorch.float32) targets torch.tensor([1, 2, 5], dtypetorch.float32)inputs torch.reshape(inputs, (1, 1, 1, 3)) targets torch.reshape(targe…

基于SSM+Vue的龙腾公司员工信息管理系统设计与实现

​ 1 绪论 1.1研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff0c;规范化管理。这样的大环境让那些止步不前&a…

分享几套ArcGIS和CAD的三调符号库和使用

在粉丝群中呢&#xff0c;一直有朋友需要三调的符号库。今天就分享几套供大家学习使用&#xff01; 这次符号库有ArcGIS和CAD的&#xff0c;使用方法可参考我们的课程学习。 分享的三调符号库&#xff0c;也是粉丝群中收集的&#xff0c;分享给大家。符号库的质量还请大家自我斟…

Python·算法·每日一题(3月15日)合并两个有序链表

题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4]示例 2&#xff1a; 输入&#xff1a;l1 [], l2 [] 输出&am…

FreeRTOS操作系统学习——软件定时器

软件定时器介绍 软件定时器允许设置一段时间&#xff0c;当设置的时间到达之后就执行指定的功能函数&#xff0c;被定时器调用的这个功能函数叫做定时器的回调函数。回调函数的两次执行间隔叫做定时器的定时周期&#xff0c;简而言之&#xff0c;当定时器的定时周期到了以后就…

Linux 多进程开发(下)

第二章 Linux 多进程开发 2.6 进程间通信2.6.1 匿名管道2.6.2 有名管道2.6.3 内存映射2.6.4 信号2.6.5 共享内存 2.7 守护进程 网络编程系列文章&#xff1a; 第1章 Linux系统编程入门&#xff08;上&#xff09; 第1章 Linux系统编程入门&#xff08;下&#xff09; 第2章 L…

【C++map和set容器:AVL树、红黑树详解并封装实现map和set】

[本节目标] map和set底层结构 AVL树 红黑树 红黑树模拟实现STL中的map和set 1.底层结构 前面对map/multimap/set/multiset进行了简单的介绍&#xff0c;在其文档介绍中发现&#xff0c;这几个容器有个 共同点是&#xff1a;其底层都是按照二叉搜索树来实现的&#xff0c;但…

2024/03/14(网络编程·day2)

一、思维导图 二、TCP通信 //服务器 #include<myhead.h>#define SER_PORT 8888 //服务器端口号 #define SER_IP "192.168.117.103" //服务器IP int main(int argc, const char *argv[]) {//1、创建一个套接字int sfd -1;sfd socket(AF_INET,SOCK_STREAM,…

阿里云价格战的背后(附阿里云服务器优惠价格明细表)

2024阿里云服务器优惠活动政策整理&#xff0c;阿里云99计划ECS云服务器2核2G3M带宽99元一年、2核4G5M优惠价格199元一年&#xff0c;轻量应用服务器2核2G3M服务器61元一年、2核4G4M带宽165元1年&#xff0c;云服务器4核16G10M带宽26元1个月、149元半年&#xff0c;云服务器8核…