挑战是在数组中找到重复项。
function firstDuplicate(a) {
const duplicates = a.map((el,idx) => {
let myVar = a.indexOf(el,idx+1);
if (myVar >= 0) return myVar;
}).filter(el => el);
if (duplicates.length){
return Math.min(... duplicates) + 1;
} else {
return -1;
}
}
console.log(firstDuplicate([3,3,3])); // 2

似乎2是正确的答案。从挑战描述:"找到第二个出现具有最小索引的第一个重复数字。换句话说,如果有多个重复的数字,则返回第二次出现的索引小于另一个出现的第二次出现的数字。"
然后我尝试使用Set。
解决方案
// Second attempt
function firstDuplicate(a) {
let duplicates = new Set();
for (let el of a){
let sizeOfDuplicates = duplicates.size;
duplicates.add(el);
if (sizeOfDuplicates + 1 !== duplicates.size) {
return el;
}
}
return -1;
}
console.log(firstDuplicate([3,3,3])); // 3

问题 第二个版本通过了所有测试,但我认为第一个版本更正确。难道答案不应该是2而不是3吗?
修改
为清楚起见,我添加了更多文字:
"实施例
对于a = [2,3,3,1,5,2],输出应为 firstDuplicate(a)= 3.
有两个重复:数字2和3.第二次出现的3的索引小于第二次出现的2,所以答案是3。"