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);
}
此函数返回数字数组中的第一个重复值。
我想减少执行时间。我应该做些什么改变?
a = [2, 3, 3, 1, 5, 2]
,输出应为firstDuplicate(a) = 3
。有两个重复:数字2
和3
。第二次出现3
的索引小于第二次2
出现的索引,因此答案为3
。
a = [2, 4, 3, 5, 1]
,输出应为firstDuplicate(a) = -1
。答案 0 :(得分:1)
如果数组包含数字或字符串,你可以这样做,
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;
答案 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)
您可以使用find
和indexOf
:
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]))
}