关于javascript:算法题数组去重进阶版JavaScript实现

数组去重,要求O(n)复杂度,传入的数组如下所示,要求去掉反复的id,并且保留最大的w,且不扭转原来的程序。

const union = [
    { id: 1, w: 1 },
    { id: 2, w: 4 },
    { id: 1, w: 2 },
    { id: 2, w: 6 }
]

JavaScript 实现

因为要求 O(n) 复杂度,所以应用了 ES6 Map 对象(相似哈希表),并且是返回新数组而不是批改原数组(删除一个元素就要挪动其余元素下标)。当初还存在两个问题:1. 应用 Map 对象无奈保障元素的程序;2. 为了输入一个数组,还得遍历 Map 对象。

function removeDuplicateElements(arr) {
    let map = new Map();
    let res = [];
    for (let i=0; i<arr.length; i++) {
        let cached = map.get(arr[i].id);
        if (!cached || (cached < arr[i].w)) {
            // 如果键值不存在
            // 或者已有的w小于以后遍历的w
            map.set(arr[i].id, arr[i].w);
        }
    }
    for (let [key, value] of map) {
        res.push({
            id: key,
            w: value
        })
    }
    return res
}

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理