抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

今天无聊把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就用不了了,以我现在的水平只能是老老实实的使用普通青年方法,唉。。。

评论