这个编码挑战的描述中是否有错误,或者我犯了错误?

时间:2018-03-18 23:50:31

标签: javascript

挑战是在数组中找到重复项。



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。"

0 个答案:

没有答案