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