Уменьшить время выполнения алгоритма "firstDuplicate"
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 дубликата: номера 2
а также 3
, Второе появление 3
имеет меньший индекс, чем второе вхождение 2
да, так что ответ 3
,
- За
a = [2, 4, 3, 5, 1]
выход должен бытьfirstDuplicate(a) = -1
,
3 ответа
Решение
Если массив содержит число или строку, вы можете сделать что-то вроде этого,
//Returns the first duplicate element
function firstDup(arr) {
let o = {}; //an empty object
for (let i = 0; i < arr.length; i++) {
if (o[arr[i]]) { //check if the property exists
return arr[i];
} else {
o[arr[i]] = 'a'; //set the object's property to something non falsy
}
}
return -1; //If No duplicate found return -1
}
console.log(firstDup([2, 3, 3, 1, 5, 2]));
console.log(firstDup([2, 4, 3, 5, 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)
Вы можете вместо этого использовать find
а также indexOf
:
function findFirstDupe(array) {
return array.find((n, i) => array.indexOf(n) !== i);
}
Или вы используете набор для проверки предыдущих появлений:
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]))
}