当前位置: 首页 > 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…...

效率倍增:用快马打造Ollama多模型对比测试工具

最近在折腾本地大模型时&#xff0c;发现Ollama虽然能方便地运行多个模型&#xff0c;但每次想对比不同模型的表现都得手动切换&#xff0c;特别影响效率。于是琢磨着做个工具来提升测试效率&#xff0c;顺便把实现过程记录下来分享给大家。 需求痛点分析 本地测试不同模型时&a…...

实测有效!Yi-Coder-1.5B生成高质量代码案例分享

实测有效&#xff01;Yi-Coder-1.5B生成高质量代码案例分享 1. 引言&#xff1a;一个轻量级但强大的编程伙伴 最近在尝试各种代码生成模型时&#xff0c;我发现了Yi-Coder-1.5B这个宝藏。说实话&#xff0c;一开始看到“1.5B”这个参数规模&#xff0c;我并没有抱太高期望——…...

从Eclipse转IntelliJ IDEA的老司机踩坑记:20个必改设置让你的迁移过程更顺滑

从Eclipse转IntelliJ IDEA的老司机踩坑记&#xff1a;20个必改设置让你的迁移过程更顺滑 第一次打开IntelliJ IDEA时&#xff0c;那种既熟悉又陌生的感觉会让任何Eclipse老手感到不安。菜单栏去哪了&#xff1f;我的项目视图怎么变了&#xff1f;为什么快捷键全都不对&#xff…...

OpenClaw定时任务管理:Qwen3-4B每日早报自动生成与推送

OpenClaw定时任务管理&#xff1a;Qwen3-4B每日早报自动生成与推送 1. 为什么需要自动化早报服务 每天早上打开电脑第一件事&#xff0c;就是查看行业动态和技术新闻。但手动收集整理的过程实在太耗时——要打开十几个网页&#xff0c;筛选有价值的信息&#xff0c;再整理成简…...

Qwen3-ForcedAligner-0.6B在美赛中的应用:跨语言访谈数据分析

Qwen3-ForcedAligner-0.6B在美赛中的应用&#xff1a;跨语言访谈数据分析 1. 引言 在美国大学生数学建模竞赛&#xff08;MCM/ICM&#xff09;中&#xff0c;参赛队伍经常面临一个棘手问题&#xff1a;如何高效处理来自不同国家、不同语言的学术访谈数据&#xff1f;传统方法…...

SAMD21 Turbo PWM:硬件级高精度同步PWM驱动详解

1. SAMD21 Turbo PWM 库深度解析&#xff1a;面向嵌入式工程师的高性能PWM驱动实践指南SAMD21 Turbo PWM 是一款专为基于 ATSAMD21G 微控制器&#xff08;如 Arduino Nano 33 IoT、Adafruit Itsy Bitsy M0、Trinket M0 等&#xff09;设计的底层硬件加速 PWM 库。它绕过 Arduin…...

OpenClaw硬件监控:Gemma-3-12b-it分析传感器数据并预警

OpenClaw硬件监控&#xff1a;Gemma-3-12b-it分析传感器数据并预警 1. 为什么需要AI驱动的硬件监控&#xff1f; 去年夏天&#xff0c;我的家用服务器因为CPU散热器故障导致过热关机&#xff0c;丢失了正在处理的科研数据。这件事让我开始思考&#xff1a;传统的阈值告警太被…...

STM32duino GNSS库深度解析:Teseo LIV3F驱动与NMEA协议实现

1. 项目概述STM32duino X-NUCLEO-GNSS1A1 是一款面向 STM32 平台的 Arduino 兼容库&#xff0c;专为意法半导体&#xff08;STMicroelectronics&#xff09;推出的 X-NUCLEO-GNSS1A1 GNSS 扩展板设计。该扩展板基于意法半导体自研的 Teseo LIV3F 单芯片 GNSS 接收器&#xff0c…...

网络资源爬取代码分享

爬取网络资源的Python代码示例以下代码使用 requests 和 BeautifulSoup 库实现合法网络资源的爬取&#xff0c;适用于数据收集和统计。确保目标网站允许爬取&#xff08;参考 robots.txt 文件&#xff09;。import requests from bs4 import BeautifulSoup import pandas as pd…...

低成本自动化:OpenClaw+Gemma-3-12b-it替代Zapier的5个场景

低成本自动化&#xff1a;OpenClawGemma-3-12b-it替代Zapier的5个场景 1. 为什么选择OpenClawGemma替代Zapier 作为一个长期使用Zapier的自动化爱好者&#xff0c;我最近开始尝试用OpenClawGemma-3-12b-it组合来替代部分Zapier工作流。这个转变源于两个痛点&#xff1a;一是Z…...