当前位置: 首页 > 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 ]
http://www.lryc.cn/news/390681.html

相关文章:

  • Firewalld 防火墙
  • Hive查询优化 - 面试工作不走弯路
  • 【VUE3】uniapp + vite中 uni.scss 使用 /deep/ 不生效(踩坑记录三)
  • 容器部署rabbitmq集群迁移
  • DP:背包问题----0/1背包问题
  • React antd umi 监听当前页面离开,在菜单栏提示操作
  • 在 Windows PowerShell 中模拟 Unix/Linux 的 touch 命令
  • 鸿蒙NEXT
  • VUE3-Elementplus-form表单-笔记
  • Analyze an ORA-12801分析并行 parallel 12801 实际原因
  • 高级运维工程师讲述银河麒麟V10SP1服务器加固收回权限/tmp命令引起生产mysql数据库事故实战
  • 昇思25天学习打卡营第09天|sea_fish
  • flutter开发实战-Charles抓包设置,dio网络代理
  • Elasticsearch:Runtime fields - 运行时字段(二)
  • Python正则表达式的入门用法(上)
  • Audio Processing Graphs 管理 Audio Units
  • 欧盟,又出了新规-通用充电器新规通用充電器的 RED 修正案如何办理?
  • thinkphp6/8 验证码
  • Ubuntu 22.04 LTS 上安装 MySQL8.0.23(在线安装)
  • 如何选择优质模型?SD3性能究竟如何?
  • Linux上脚本备份数据库(升级版)
  • 【深度解析】滑动窗口:目标检测算法的基石
  • 约束:对于数据的限制
  • 【总线】AXI4第七课时:AXI的额外的控制信息(PROT和CACHE)
  • MAVEN 重新配置参考
  • ByteTrack论文阅读笔记
  • LVS+Keepalived 高可用集群搭建实验
  • 代码随想三刷动态规划篇7
  • linux应用开发基础知识(八)——内存共享(mmap和system V)
  • 上海小程序开发需要进行定制开发吗?