减少“firstDuplicate”算法的执行时间

时间:2017-12-24 12:00:34

标签: javascript

function firstDuplicate(a) {
  var numbers = {},
      res;

foo:
  for (var i = 0; i < a.length; i++) {
    for (var j = i + 1; j < a.length; j++) {
      if (a[i] === a[j]) {
        numbers[a[i]] = j - i;
        if (j - i === 1 ) {
            break foo;
        }
      }
    }
  }

  var keys = Object.keys(numbers),
      res = keys[0];

  keys.forEach(function (v) {
    res = numbers[res] > numbers[v] ? v : res;
  });

  console.log(res);

  return res === undefined ? -1 : Number(res);
}

此函数返回数字数组中的第一个重复值。

我想减少执行时间。我应该做些什么改变?

实施例

  1. 对于a = [2, 3, 3, 1, 5, 2],输出应为firstDuplicate(a) = 3
  2. 有两个重复:数字23。第二次出现3的索引小于第二次2出现的索引,因此答案为3

    1. 对于a = [2, 4, 3, 5, 1],输出应为firstDuplicate(a) = -1

3 个答案:

答案 0 :(得分:1)

如果数组包含数字或字符串,你可以这样做,

&#13;
&#13;
df

   Name  Year     Value
0     A  2000       NaN
1     A  2001       NaN
2     A  2002       NaN
3     A  2003  0.000000
4     A  2004  2.000000
5     B  1998       NaN
6     B  1999 -0.323529
7     B  2000       NaN
8     B  2001       NaN
9     B  2002       NaN
10    B  2003       NaN
11    B  2004 -0.500000
&#13;
&#13;
&#13;

答案 1 :(得分:1)

function firstDuplicate(array) {
  const numbers = {};
  
  for (const number of array) {
    if (numbers[number]) {
      return number;
    } else {
      numbers[number] = true;
    }
  }
  
  return -1; // No duplicate
}

const duplicate = firstDuplicate([1, 2, 3, 4, 5, 6, 10, 1, 3]);
console.log(duplicate)

答案 2 :(得分:0)

您可以使用findindexOf

 function findFirstDupe(array) {
   return array.find((n, i) => array.indexOf(n) !== i);
 }

或者您使用Set来检查以前的外观:

function findFirstDupe(array){
  const set = new Set();
  return array.find(n => set.has(n) || (set.add(n), false));
}

与作为哈希的对象相同:

function findFirstDupe(array){
  const hash = {};
  return array.find(n => !(hash[n] = !hash[n]))
}