Поиск одинаковых чисел массива

Задача.
Написать функцию, которая находит в массиве значения, повторяющиеся два и более раз, и возвращает их.

Решение.
Предложу два варианта решения. Первый вариант – классический, более длинный в плане кода, и возможно, немного более сложный для понимания, но и более оптимальный. Т.е. в данном алгоритме нет никаких лишних шагов и его можно использовать для больших массивов.
Второй вариант – более короткий в записи и более очевидный, но будет дольше выполняться в случае больших массивов, поскольку содержит предварительную сортировку массива.
Обращаю внимание, что оба варианта в результате выдают уникальные значения. Т.е., если исходный массив содержит, например, значение 5 более 2-х раз, то в результате 5 будет выведено один раз. Если по условию задачи этого не требуется, то в коде нужно убрать блоки проверки уникальности результата.


Вариант 1:
Суть алгоритма в том, что внешним циклом мы проходим исходный массив слева-направо, а внутренним циклом идем от текущего элемента в обратную сторону справа-налево. Более подробно данный метод рассматривался в статье Подсчет количества уникальных чисел в массиве.
var arr = [1,5,7,1,8,4,3,5,5,9,0,0,0,0];
function duplicate_values(arr) 
{
	var arr_res = []; // результирующий массив
    /* проход по массиву слева-направо */
	for (var i=1; i < arr.length; i++) {                   
        /* проходим массив в обратном порядке, начиная с элемента arr[i-1] */                   
        for (var j=i-1; j >= 0; j--) { 
            /* если ранее в массиве уже встречался элемент
               с таким же значением как и у текущего, 
               то помещаем это значение в результирующий массив
               (предварительно проверив, нет ли там уже такого значения), 
               завершаем внутренний цикл и переходим 
               на следующую итерацию внешнего цикла*/ 
            if (arr[j] == arr[i]) { 
            	var is_unique = true; // флаг уникальности элемента
                for (var k=0; k < arr_res.length; k++) {
                	if (arr_res[k] == arr[i]) {
						is_unique = false;
						break;
                	}
				}
				if (is_unique) {
					arr_res.push(arr[i]); 
				}
				break;
            } 
        } 
	} 
	return arr_res;
}
document.write(duplicate_values(arr));

Вариант 2:
Во втором варианте решения, мы сначала сортируем массив с помощью метода sort() и после этого нам не нужно делать обратный ход по массиву, как в предыдущем варианте решения. Нам достаточно сравнить значения текущего и предыдущего элемента. Данная методика применялась при решении задачи, описанной в статье Все ли элементы массива различны.
var arr = [1,5,7,1,8,4,3,5,5,9,0,0,0,0];
function duplicate_values(arr)
{
	arr_res = [];
	arr.sort();	
	for (var i=1; i < arr.length; i++) {                   
		if (arr[i] == arr[i-1]) {
            var is_unique = true; 
            for (var k=0; k < arr_res.length; k++) {
                if (arr_res[k] == arr[i]) {
					is_unique = false;
					break;
                }
			}
			if (is_unique) {
				arr_res.push(arr[i]); 
			}
		}			
	}
	return arr_res;
}
document.write(duplicate_values(arr));

Цикл проверки наличия элемента в результирующем массиве можно заменить на следующую конструкцию:
var idx = arr_res.indexOf(arr[i]);          
    if (idx >= 0) {
        is_unique = false;
    }

Надеюсь, тема раскрыта. Если есть вопросы – спрашивайте, постараюсь ответить.
Теги:
Поиск
Добавлено: 12 Июля 2018 21:13:36 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...