Задача.
Написать функцию, которая находит в массиве значения, повторяющиеся два и более раз, и возвращает их.
Решение.
Предложу два варианта решения. Первый вариант – классический, более длинный в плане кода, и возможно, немного более сложный для понимания, но и более оптимальный. Т.е. в данном алгоритме нет никаких лишних шагов и его можно использовать для больших массивов.
Второй вариант – более короткий в записи и более очевидный, но будет дольше выполняться в случае больших массивов, поскольку содержит предварительную сортировку массива.
Обращаю внимание, что оба варианта в результате выдают уникальные значения. Т.е., если исходный массив содержит, например, значение 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;
}
Надеюсь, тема раскрыта. Если есть вопросы – спрашивайте, постараюсь ответить.