今天无聊把coding中常用的数组去重归纳总结一下——
基于origin数组去重:
const origin_arr = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 5, 2, 0]
let res = []
普通青年:
时间复杂度:$$O(N^2)$$
for (let i = 0; i < origin_arr.length; i++) {
let isRepeat = false
// j = i + 1
// => 从i往后加一位比较,发现后面有重复就不将当前元素添加进res,没有重复就添加
for (let j = i + 1; j < origin_arr.length; j++) {
if (origin_arr[i] === origin_arr[j]) {
isRepeat = true
break
}
}
if (!isRepeat) {
res.push(origin_arr[i])
}
}
console.log(res) // output: [9, 8, 7, 6, 4, 3, 1, 5, 2, 0]
reduce方法:
// 将数组从小到大排序
res = origin_arr.sort(((a, b) => a - b))
// 排序后的数据相邻之间的重复元素是相同的,判断他俩不相同,添加当前的就好了
// 下次迭代拿到的pre是新数组,存放结果的数组
res = res.reduce((pre, cur) => {
if (pre.length === 0 || pre[pre.length - 1] !== cur) {
pre.push(cur)
}
return pre
}, [])
console.log(res) // output: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
普通青年改进方法:
空间复杂度:$$O(N)$$
时间复杂度:$$O(logN) + O(N)$$
sorted_arr = origin_arr.sort(((a, b) => a - b))
// 跟上面的原理类似:排序后的数据相邻之间的重复元素是相同的,判断他俩不相同,添加当前的就好了
for (let i = 0; i < sorted_arr.length; i++) {
if (sorted_arr[i] !== sorted_arr[i - 1]) {
res.push(sorted_arr[i])
}
}
console.log(res) // output: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
includes方法:
origin_arr.forEach(elem => {
// 如果不在已经添加的数组中,则没出现过,添加进去
if (!res.includes(elem)) {
res.push(elem)
}
})
console.log(res) //output: [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
Set方法:
res = [...new Set(origin_arr)]
console.log(res)
总结
数据都是简单的数字的话直接用Set好了,貌似我经常比较数组里的对象是不是同一个对象,这时候Set就用不了了,以我现在的水平只能是老老实实的使用普通青年方法,唉。。。