当前位置: 首页 > news >正文

手写数组去重

方法1-判断相邻元素

function _deleteRepeat(arr){if(!Array.isArray(arr)){throw new Error('参数必须是数组')}let res=[];// 使用slice创建arr的副本,并排序let sortArr=arr.slice().sort((a,b)=>a-b);for(let i=0;i<sortArr.length;i++){if(i===sortArr.length-1||sortArr[i]!==sortArr[i+1]){res.push(sortArr[i]);}}return res;
}
//示例
let arr=[1,2,1,2,3,4];
console.log(_deleteRepeat(arr));  //输出[ 1, 2, 3, 4 ]

该函数 _deleteRepeat 的目的是从一个数组中删除重复的元素,同时保持元素的原始顺序。这里是如何工作的:

  1. 参数检查: 首先检查传入的 arr 是否为数组(使用 Array.isArray(arr))。如果不是数组,则抛出错误,不执行后续操作。
  2. 数组复制与排序: 使用 arr.slice() 创建原数组的一个浅拷贝,这样做是为了避免直接修改原数组。然后,对这个副本调用 sort((a, b) => a - b) 进行升序排序。这样可以将相同的元素放在一起,便于后续比较和去重。
  3. 遍历与去重:
    • 初始化一个空数组 res,用于存放去重后的结果。
    • 遍历排序后的数组 sortArr
      • 对于每个元素,如果它是数组的最后一个元素,或者它与下一个元素不同(sortArr[i] !== sortArr[i + 1]),则将其添加到结果数组 res 中。这个判断条件确保了只有当一个元素与其前一个元素不同(在排序后的情况下)时,才会被保留,从而实现了去重。
  1. 返回结果: 遍历结束后,res 数组中就存储了所有去重且保持原始顺序的元素,最后返回这个数组。

示例:

let arr = [1, 2, 2, 3, 4, 4, 4, 5];
console.log(_deleteRepeat(arr)); // 输出: [1, 2, 3, 4, 5]

这个函数有效地去除了数组中的重复元素,同时维持了元素的原始顺序。不过需要注意的是,对于大数组,排序操作可能会导致性能开销较大。如果保留原始顺序的同时追求更高的效率,可以考虑使用其他方法,如使用哈希表来记录元素出现的情况。


还有很多其他实现方式

为了提高性能,可以使用一个对象(或 Set)来跟踪已经看到的元素,从而将时间复杂度降低到 O(n)

在这个改进的版本中,我们直接将 arr 转换为 Set,这将自动去除重复项。然后,我们使用 Array.from(res) 将 Set 转换回数组并返回。

function quChong(arr){if(!Array.isArray(arr)){throw new Error('参数必须是数组')}return [...new Set(arr)];
}
// function quChong(arr) {  
//     if (!Array.isArray(arr)) {  
//       return;  
//     }  
//     let res = new Set(arr);  
//     console.log(res)  //Set(4) { 1, 2, 3, 4 } 对象集合
//     return Array.from(res);  
//   }
//示例
let arr=[1,2,1,2,3,4];
console.log(quChong(arr));  //输出[ 1, 2, 3, 4 ]

相关文章:

手写数组去重

方法1-判断相邻元素 function _deleteRepeat(arr){if(!Array.isArray(arr)){throw new Error(参数必须是数组)}let res[];// 使用slice创建arr的副本&#xff0c;并排序let sortArrarr.slice().sort((a,b)>a-b);for(let i0;i<sortArr.length;i){if(isortArr.length-1||s…...

Firewalld 防火墙

1. 概述 在 RHEL7 系统中&#xff0c;firewalld 防火墙取代了传统的 iptables 防火墙。iptables 的防火墙策略是通过内核层面的 netfilter 网络过滤器来处理的&#xff0c;而 firewalld 则是通过内核层面的 nftables 包过滤框架来处理。firewalld 提供了更为丰富的功能和动态更…...

Hive查询优化 - 面试工作不走弯路

引言&#xff1a;Hive作为一种基于Hadoop的数据仓库工具&#xff0c;广泛应用于大数据分析。然而&#xff0c;由于其依赖于MapReduce框架&#xff0c;查询的性能可能会受到影响。为了确保Hive查询能够高效运行&#xff0c;掌握查询优化技巧至关重要。在日常工作中&#xff0c;高…...

【VUE3】uniapp + vite中 uni.scss 使用 /deep/ 不生效(踩坑记录三)

vite 中使用 /deep/ 进行样式穿透报错 原因&#xff1a;vite 中不支持&#xff0c;换成 ::v-deep 或:deep即可...

容器部署rabbitmq集群迁移

1、场景&#xff1a; 因业务需要&#xff0c;要求把rabbitmq-A集群上的数据迁移到rabbitmq-B集群上&#xff0c;rabbitmq的数据包括元数据&#xff08;RabbitMQ用户、vhost、队列、交换和绑定&#xff09;和消息数据&#xff0c;而消息数据存储在单独的消息存储库中。 2、迁移要…...

DP:背包问题----0/1背包问题

文章目录 &#x1f497;背包问题&#x1f49b;背包问题的变体&#x1f9e1;0/1 背包问题的数学定义&#x1f49a;解决背包问题的方法&#x1f499;例子 &#x1f497;解决背包问题的一般步骤&#xff1f;&#x1f497;例题&#x1f497;总结 ❤️❤️❤️❤️❤️博客主页&…...

React antd umi 监听当前页面离开,在菜单栏提示操作

需求是我这里有个页面&#xff0c;离开当前页面之后&#xff0c;需要在菜单栏显示个提示&#xff0c;也就是Tour const [unblock, setUnblock] useState<() > void>(() > () > {});const [next, setNext] useState();useEffect(() > {const unblockHandler…...

在 Windows PowerShell 中模拟 Unix/Linux 的 touch 命令

在 Unix 或 Linux 系统中&#xff0c;touch 命令被广泛用于创建新文件或更新现有文件的时间戳。不过&#xff0c;在 Windows 系统中&#xff0c;尤其是在 PowerShell 环境下&#xff0c;并没有内置的 touch 命令。这篇博客将指导你如何在 Windows PowerShell 中模拟 touch 命令…...

鸿蒙NEXT

[中国&#xff0c;东莞&#xff0c;2024年6月24日] 华为开发者大会&#xff08;HDC&#xff09;正式开幕&#xff0c;带来全新的 HarmonyOS NEXT、盘古大模型5.0等最创新成果&#xff0c;持续为消费者和开发者带来创新体验。 HarmonyOS NEXT 鸿蒙生态 星河璀璨 鸿蒙生态设备数…...

VUE3-Elementplus-form表单-笔记

1. 结构相关 el-row表示一行&#xff0c;一行分成24份 el-col表示列 (1) :span"12" 代表在一行中&#xff0c;占12份 (50%) (2) :span"6" 表示在一行中&#xff0c;占6份 (25%) (3) :offset"3" 代表在一行中&#xff0c;左侧margin份数 el…...

Analyze an ORA-12801分析并行 parallel 12801 实际原因

"ORA-06512: at "PKG_P_DATA", line 19639 ORA-06512: at "PKG_P_DATA", line 19595 ORA-06512: at "PKG_P_DATA", line 14471-JOB 调用 -ORA-12801: error signaled in parallel query server P009, instance rac2:dwh2 (2) Error: ORA-12…...

高级运维工程师讲述银河麒麟V10SP1服务器加固收回权限/tmp命令引起生产mysql数据库事故实战

高级运维工程师讲述银河麒麟V10SP1服务器加固收回权限/tmp命令引起生产MySql数据库事故实战 一、前言 作为运维工程师经常会对生产服务器进行安全漏洞加固&#xff0c;一般服务厂商、或者甲方信息安全中心提供一些安全的shell脚本&#xff0c;一般这种shell脚本都是收回权限&…...

昇思25天学习打卡营第09天|sea_fish

打开第九天&#xff0c;本次学习的内容为保存与加载&#xff0c;记录学习的过程。本次的内容少而且简单。 在训练网络模型的过程中&#xff0c;实际上我们希望保存中间和最后的结果&#xff0c;用于微调&#xff08;fine-tune&#xff09;和后续的模型推理与部署&#xff0c;因…...

flutter开发实战-Charles抓包设置,dio网络代理

flutter开发实战-Charles抓包设置 在开发过程中抓包&#xff0c;可以看到请求参数等数据&#xff0c;方便分析问题。flutter上使用Charles抓包设置。dio需要设置网络代理。 一、dio设置网络代理 在调试模式下需要抓包调试&#xff0c;所以需要使用代理&#xff0c;并且仅用H…...

Elasticsearch:Runtime fields - 运行时字段(二)

这是继上一篇文章 “Elasticsearch&#xff1a;Runtime fields - 运行时字段&#xff08;一&#xff09;” 的续篇。 在查询时覆盖字段值 如果你创建的运行时字段与映射中已存在的字段同名&#xff0c;则运行时字段会隐藏映射字段。在查询时&#xff0c;Elasticsearch 会评估运…...

Python正则表达式的入门用法(上)

Python正则表达式是使用re模块来进行操作的。re模块提供了一组函数&#xff0c;用于进行字符串的匹配和查找操作。 下面是Python中使用正则表达式的一些常用函数&#xff1a; re.search(pattern, string)&#xff1a;在字符串中查找并返回第一个匹配的对象。 re.match(patte…...

Audio Processing Graphs 管理 Audio Units

Audio Processing Graphs 管理 Audio Units Audio Processing Graphs 管理 Audio UnitsAudio Processing Graph 拥有精确的 I/O UnitAudio Processing Graph 提供线程安全通过 graph "pull" 音频流 Audio Processing Graphs 管理 Audio Units audio processing grap…...

欧盟,又出了新规-通用充电器新规通用充電器的 RED 修正案如何办理?

欧盟&#xff0c;又出了新规-通用充电器新规通用充電器的 RED 修正案如何办理&#xff1f; 欧盟新规委员会发布《通用充电器指令》指南通用充電器的 RED 修正案办理流程&#xff1a; 2024年5月7日&#xff0c;欧盟委员会发布《通用充电器指令》指南&#xff0c;修订了《无线…...

thinkphp6/8 验证码

html和后台验证代码按官方来操作 ThinkPHP官方手册 注意&#xff1a; 如果验证一直失败&#xff0c;看看Session是否开启&#xff0c; 打印dump(session_status());结果2为正确的&#xff0c; PHP_SESSION_DISABLED: Session功能被禁用&#xff08;返回值为0&#xff09;。…...

Ubuntu 22.04 LTS 上安装 MySQL8.0.23(在线安装)

目录 在线安装MySQL 步骤1&#xff1a;更新软件包列表 步骤2&#xff1a;安装MySQL服务器 步骤3&#xff1a;启动MySQL服务 步骤4&#xff1a;检查MySQL状态 步骤5&#xff1a;修改密码、权限 在线安装MySQL 步骤1&#xff1a;更新软件包列表 在进行任何软件安装之前&a…...

Gemma-3 Pixel Studio快速上手:支持表格图像的结构化数据提取技巧

Gemma-3 Pixel Studio快速上手&#xff1a;支持表格图像的结构化数据提取技巧 1. 工具介绍与核心能力 Gemma-3 Pixel Studio是基于Google最新Gemma-3-12b-it模型构建的多模态对话终端&#xff0c;特别擅长处理包含表格的图像数据。与传统OCR工具不同&#xff0c;它不仅能识别…...

Linux 五大 I/O 模型深度解析

在构建高并发、高性能的后端系统时&#xff08;如各种中间件、Web 服务器&#xff09;&#xff0c;我们不可避免地会接触到 I/O&#xff08;Input/Output&#xff09;模型。很多开发者对 BIO、NIO、AIO 以及多路复用等概念感到混淆。要真正从底层掌握这些模型&#xff0c;我们需…...

Mermaid在线编辑器终极指南:免费实时图表创作工具完全解析

Mermaid在线编辑器终极指南&#xff1a;免费实时图表创作工具完全解析 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me/mermaid-live-ed…...

​​​​​​​中山网站建设哪家好?从AI搜索变革看网站建设的规范流程

在讨论“中山网站建设哪家好”之前&#xff0c;有一个更底层的问题需要先理解&#xff1a;&#x1f449; 网站的价值&#xff0c;正在被AI重新定义。一、信息获取路径正在发生根本变化过去二十年&#xff0c;用户获取信息的方式大致是&#xff1a;用户提出问题 → 打开搜索引擎…...

【AI】可以操控鼠标的智能体

2026-04-02&#xff0c;以下是当前&#xff08;截至2026年初&#xff09;可以操作鼠标的AI智能体最新格局&#xff0c;分为操作系统级控制&#xff08;真鼠标键盘控制&#xff09;和浏览器级控制两类&#xff1a;第一梯队&#xff1a;操作系统级鼠标控制&#xff08;全桌面操控…...

假芯片识别与防范:工程师实战指南

1. 假芯片泛滥&#xff1a;半导体行业的隐秘危机最近在调试一块电路板时&#xff0c;我发现一个奇怪的现象&#xff1a;明明使用的是同型号的MCU&#xff0c;但部分板子的功耗异常偏高。经过一周的排查&#xff0c;最终发现问题出在芯片上——我们采购到了一批"套牌"…...

基于BANG语言的Sigmoid算子开发与PyTorch集成实战指南

1. BANG语言与Sigmoid算子开发基础 第一次接触寒武纪BANG语言时&#xff0c;我被它类似CUDA但更简洁的语法设计惊艳到了。这种专为MLU硬件设计的异构编程语言&#xff0c;通过在C/C基础上扩展并行计算特性&#xff0c;让开发者能更高效地利用寒武纪芯片的算力资源。 BANG核心语…...

Grove-I2C颜色传感器驱动开发与RGB色彩识别实践

1. Grove-I2C颜色传感器技术解析与嵌入式驱动开发实践 1.1 模块硬件架构与传感原理 Grove-I2C颜色传感器模块基于TAOS&#xff08;现为ams OSRAM&#xff09;TCS3414CS高精度数字颜色传感器芯片设计&#xff0c;其核心传感单元由16个微型光电二极管阵列构成&#xff0c;呈82物…...

G-Helper终极指南:华硕笔记本轻量级控制工具完全教程

G-Helper终极指南&#xff1a;华硕笔记本轻量级控制工具完全教程 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Strix, Sca…...

OpenClaw自动化测试:千问3.5-27B驱动UI全流程验证

OpenClaw自动化测试&#xff1a;千问3.5-27B驱动UI全流程验证 1. 为什么选择OpenClaw做自动化测试&#xff1f; 去年接手一个前端重构项目时&#xff0c;我遇到了一个典型困境&#xff1a;每次代码改动后&#xff0c;都需要手动执行47个关键页面的功能测试。这套测试流程完整…...