乐趣区

关于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
}
退出移动版