无序数组找重复数字

参考链接🔗的第4种方法,非常巧妙!

 

### 使用 JavaScript 实现移除数组中的重复项 在编程中,可以通过多种方式实现移除数组中的重复项。以下是几种常见的方法及其原理: #### 方法一:利用 `Set` 数据结构 `Set` 是一种集合数据结构,它会自动去重并存储唯一的值。通过将其转换回数组的方式可以轻松完成去重。 ```javascript function removeDuplicatesUsingSet(arr) { return [...new Set(arr)]; } let array = [1, 2, 3, 4, 3, 2, 1]; console.log(removeDuplicatesUsingSet(array)); // 输出: [1, 2, 3, 4] ``` 这种方法的时间复杂度主要取决于创建 `Set` 的过程,通常为 O(n),其中 n 表示数组长度[^1]。 --- #### 方法二:使用 `filter` `indexOf` 此方法基于数组的索引来判断某个元素是否首次出现。 ```javascript function removeDuplicatesUsingFilter(arr) { return arr.filter((item, index) => arr.indexOf(item) === index); } let array = [1, 2, 3, 4, 3, 2, 1]; console.log(removeDuplicatesUsingFilter(array)); // 输出: [1, 2, 3, 4] ``` 该方法的核心在于每次调用 `arr.indexOf(item)` 来查当前元素第一次出现的位置。如果当前位置等于其首次出现位置,则保留;否则丢弃。由于嵌套循环的存在,时间复杂度较高,约为 O(n²)。 --- #### 方法三:双指针法(适用于已排序数组) 对于已经排序好的数组,可采用双指针技术高效地移除重复项。具体做法是维护两个指针分别指向不同部分的据区域,并逐步更新慢速指针所对应的值。 ```javascript function removeDuplicatesInSortedArray(nums) { if (nums.length === 0) return 0; let slow = 0; for (let fast = 1; fast < nums.length; fast++) { if (nums[slow] !== nums[fast]) { slow++; nums[slow] = nums[fast]; } } return slow + 1; } // 测试用例 let sortedArray = [1, 1, 2, 2, 3, 4, 4, 5]; removeDuplicatesInSortedArray(sortedArray); console.log(sortedArray.slice(0, removeDuplicatesInSortedArray(sortedArray))); // 输出: [1, 2, 3, 4, 5] ``` 这种策略特别适合于规模据集上的操作,因为它仅需单次遍历整个列表即可达到目的,因此具有较低的时间开销——O(n)[^2]^。 --- #### 方法四:借助哈希表辅助空间优化版本 虽然上述三种方案各有优劣之处,但在某些特定情况下可能还需要考虑额外的空间消耗问题。下面介绍另一种思路即引入对象作为临时容器保存遇到过的键名从而进一步减少内存占用量的同时保持较高的执行效率: ```javascript function removeDuplicatesWithHash(arr){ const hashTable={}; const result=[]; for(let elem of arr){ if(!hashTable.hasOwnProperty(elem)){ hashTable[elem]=true; result.push(elem); } } return result; } const arrayWithDups=[9,'a',8,'b','c',7,'d','e',6,'f']; console.log(removeDuplicatesWithHash(arrayWithDups));//输出:[9,"a",8,"b","c",7,"d","e",6,"f"] ``` 这里定义了一个空的对象用于追踪哪些项目已经被加入到最终的结果集中去了如果没有发现相同的则追加进去反之忽略之故而实现了我们的目标同时兼顾性能表现良好因为查询属性存在与否的操作平均来说是非常快速接近常级别所以总体上也是线性的复杂程度即O(N)[^3]. --- ### 总结 以上介绍了四种不同的解决方案来应对如何去掉给定序列里面的冗余成分这个问题每种都有各自的特点以及适用范围开发者应当根据实际需求选取最合适的那一个比如当面对的是无序状态下的整型数字串列那么运用内置函配合散列表可能是最佳选项而对于那些预先经过排列整理后的材料而言采取两头夹击式的扫描机制无疑更加经济实惠既节省了计算资源又提高了工作效率.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值