数组去重,要求 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
}