从数组中找到第一个重复数字,第二个匹配项具有最小索引

时间:2017-12-07 18:53:01

标签: javascript arrays

我正在尝试编写一个javascript代码,以便从第二次出现最小索引的arrayn中找到第一个重复的数字。我已经编写了该函数,除了测试用例外几乎所有给定的数组都能正常工作如下所示。

输入: a:[1,1,2,2,1] 输出: 2 预期产出: 1

javascript代码如下所示

function firstDuplicate(a) {

  var firstIndex = "";
  var isMatch = false;
  for (var i = 0; i <= a.length; i++) {
    for (var j = i + 1; j <= a.length; j++) {
      alert(a[i] + "," + a[j]);
      if (a[i] === a[j]) {
        firstIndex = j;
        isMatch = true;
        break;
      }
    }


  }
  if (isMatch)
    return a[firstIndex];
  else
    return -1;

}

程序在第二个for循环中使用alert语句进行窃听。我发现a [i]和a [j]的值在循环本身的第一次执行中是相同的,但是下面的if条件失败了。我想知道这是怎么发生的,任何人都可以解释为什么会发生这种情况?

2 个答案:

答案 0 :(得分:1)

如果 ,则只应设置firstIndex

此外,您的循环边界不正确。他们应该<而不是<=

&#13;
&#13;
console.log(firstDuplicate([1, 1, 2, 2, 1])); // 1
console.log(firstDuplicate([2, 3, 3, 1, 5, 2])); // 3
console.log(firstDuplicate([2, 4, 3, 5, 1])); // -1

function firstDuplicate(a) {
  var firstIndex = Infinity;
  var isMatch = false;
  for (var i = 0; i < a.length; i++) {
    for (var j = i + 1; j < a.length; j++) {
      // ---------------vvvvvvvvvvvvvvvvv
      if (a[i] === a[j] && j < firstIndex) {
        firstIndex = j;
        isMatch = true;
        break;
      }
    }
  }
  if (isMatch)
    return a[firstIndex];
  else
    return -1;
}
&#13;
&#13;
&#13;

这是另一种写作方式:

&#13;
&#13;
console.log(firstDuplicate([1, 1, 2, 2, 1])); // 1
console.log(firstDuplicate([2, 3, 3, 1, 5, 2])); // 3
console.log(firstDuplicate([2, 4, 3, 5, 1])); // -1

function firstDuplicate(a) {
  let idx = Infinity;
  for (const [i, n] of a.entries()) {
    const dupIdx = a.indexOf(n, i+1);
    if (dupIdx !== -1 && dupIdx < idx) {
      idx = dupIdx;
    }
  }
  return isFinite(idx) ? a[idx] : -1;
}
&#13;
&#13;
&#13;

答案 1 :(得分:0)

您可以采用单循环方法,使用哈希表来指示访问过的项目。

function firstDuplicate(array) {
    var hash = Object.create(null),
        i = 0,
        l = array.length,
        item;

    while (i < l) {
        item = array[i];
        if (hash[item]) {
            return item;
        }
        hash[item] = true;
        i++;
    }
    return -1;
}

console.log(firstDuplicate([1, 1, 2, 2, 1]));    //  1
console.log(firstDuplicate([2, 3, 3, 1, 5, 2])); //  3
console.log(firstDuplicate([2, 4, 3, 5, 1]));    // -1