【发布时间】:2018-08-11 23:58:14
【问题描述】:
试图解决这个问题 -
给定一个数组 a,它只包含从 1 到 a.length 范围内的数字,找到第二次出现具有最小索引的第一个重复数字。
这是我的解决方案 -
function firstDuplicate(a) {
for (let i = 0; i < a.length; i++) {
if (a.indexOf(a[i]) !== i) {
return a[i];
}
}
return -1;
}
问题 - 接受标准之一是,算法应该在 4 秒内找到第一个重复值,当输入数组很大时我无法实现。我使用包含 100k 个项目的输入数组进行了测试,我的算法花费了 5 秒以上。有人可以帮我调整我的代码,让它在 4 秒内完成吗?
非常感谢!
【问题讨论】:
-
喜欢这个?
let dupe = arr.find((k,i) => arr.indexOf(k) !==i); -
使用集合来添加独特的项目。这工作得更快
function firstDuplicate(a) { var uniques = new Set(); for(let item of a) { if(uniques.has(item)) { return item; } else { uniques.add(item); } } return -1; } -
使用地图并存储计数。如果地图包含一个计数大于 1 的键,则返回它。
标签: javascript arrays algorithm