Алгоритмы: Поиск дублей в массиве

Выполнение задачи будет на JavaScript в нескольких вариантах с примерной оценкой Big O Notation. Искомые дубли являются только примитивами.

Самое базовое решение, это 2 цикла

Самое простое решение «в лоб», если линейно пытаться решить. Нужно обязательно собрать где-то значения, в этом случае объект, чтобы сосчитать и потом получить их. Сложность алгоритма ~ O(n2)

function findDuplicates(arr) {
	const valueKeyCounters = {};
	for (let i = 0; i < arr.length; i++) {
		if (valueKeyCounters[arr[i]]) {
			continue;
		}

		for (let j = i; j < arr.length; j++) {
			if (valueKeyCounters[arr[j]]) {
			valueKeyCounters[arr[j]] = valueKeyCounters[arr[j]] + 1;
			} else {
			valueKeyCounters[arr[j]] = 1;
			}
		}
	}

	const resultArr = [];
	for (key in valueKeyCounters) {
		if (valueKeyCounters[key] > 1) {
			resultArr.push(key)
		}
	}

	return resultArr
;
}

const collection = [1, 2, 2, 3, 4, 5, 5];

Самый короткий вариант через filter и IndexOf:

Сложность алгоритма ~ O(n2)

const collection = [1, 2, 2, 3, 4, 5, 5];
const findDuplicates = arr => 
   arr.filter((item, index) => arr.indexOf(item) !== index)
console.log(findDuplicates(collection)); // результат: [2, 5]

Решение через коллекцию значений Set:

Сложность алгоритма ~ O(n)

function findDuplicates(arr) {
    const uniqueElements = new Set(arr);
    const filteredElements = arr.filter(item => {
        if (uniqueElements.has(item)) {
            uniqueElements.delete(item);
        } else {
            return item;
        }
    });

    return [...new Set(filteredElements)]
}

const collection = [1, 2, 2, 3, 4, 5, 5];
console.log(findDuplicates(collection)); // Результат: [2, 5]

Интересное решение через рекурсию:

Сложность алгоритма ~ O(n). У решения есть минус т.к мутируется сама коллекция.

const findDuplicates = (arr, double = [], len = 0, deletable = false) => {
   if(len < arr.length){
      if (deletable) {
         double.push(arr[len]);
         arr.splice(len, 1);
         len--;
      }
      return findDuplicates(arr, double, len+1, arr[len] === arr[len+1])
   };
   return double;
};

const collection = [1, 2, 2, 3, 4, 5, 5];
console.log(findDuplicates(collection)); // Результат: [2, 5]
Читайте также
Rust поднимается на 13-е место в индексе Tiobe, ожидается вход в топ-10
Rust поднимается на 13-е место в индексе Tiobe, ожидается вход в топ-10
Rust поднимается на 13-е место в индексе Tiobe, ожидается вход в топ-10

Язык программирования Rust достиг новых высот в ежемесячном индексе популярности языков Tiobe, заняв в июле 13-е место и имея перспективы войти в топ-10 в ближайшем будущем. Ранее Rust не поднимался выше 17-го места в этом рейтинге. Пол Янсен, генеральный директор Tiobe, объяснил стремительное восхождение Rust в своем свежем отчете. Янсен отметил, что февральский доклад Белого дома США рекомендовал использовать Rust вместо C/C++ из соображений безопасности, что существенно повлияло на рост популярности этого языка.

Что нового для разработчиков в Chrome 119
Что нового для разработчиков в Chrome 119
Что нового для разработчиков в Chrome 119

Обновлен верхний предел срока действия файлов cookie, уже находящихся в хранилище, в CSS появились новые псевдоклассы , синтаксис относительного цвета и многое другое. Подробнее в обзоре.

Java: новости в октябре
Java: новости в октябре
Java: новости в октябре

Рассказываем о некоторых новостях в октябре в Java, среди них JDK 22, BellSoft, Oracle, GraalVM, Open Liberty.

Что нового в стабильных версиях браузеров Firefox и Chrome в марте
Что нового в стабильных версиях браузеров Firefox и Chrome в марте
Что нового в стабильных версиях браузеров Firefox и Chrome в марте

Рассмотрим новые функции, которые добавили в веб-платформы Firefox 123 and Chrome 122.