Найти первый дубликат в массиве

Учитывая массив a, который содержит только числа в диапазоне от 1 до a.length, найдите первый дубликат числа, для которого второе вхождение имеет минимальный индекс. Другими словами, если имеется более 1 дублированного числа, вернуть номер, для которого второе вхождение имеет меньший индекс, чем второе вхождение другого числа. Если таких элементов нет, вернуть -1.

Мой код:

function firstDuplicate($a) {
$unique = array_unique($a);

foreach ($a as $key => $val) {
if ($unique[$key] !== $val){
return $key;
}else{
return -1;
}
}
}

Код выше будет в порядке, когда ввод [2, 4, 3, 5, 1] но если вход [2, 1, 3, 5, 3, 2] вывод неверный. Второе повторное вхождение имеет меньший индекс. Ожидаемый результат должен быть 3.

Как я могу исправить свой код для вывода правильного результата?

1

Решение

$arr = array(2,1,3,5,3,2);
function firstDuplicate($a) {
$res = -1;
for ($i = count($a); $i >= 1; --$i) {
for ($j = 0; $j < $i; ++$j) {
if ($a[$j] === $a[$i]) {
$res = $a[$j];
}
}
}
return $res;
}
var_dump(firstDuplicate($arr));

Обходя массив в обратном направлении, вы перезапишете все предыдущие дубликаты новым, с более низким индексом.

Примечание: это возвращает значение (не индекс), если только не найден дубликат. В этом случае он возвращает -1.

1

Другие решения

// Return index of first found duplicate value in array
function firstDuplicate($a) {
$c_array = array_count_values($a);
foreach($c_array as $value=>$times)
{
if($times>1)
{
return array_search($value, $array);
}
}
return -1;
}

array_count_values ​​() будет подсчитывать для вас повторяющиеся значения в массиве, затем вы просто будете перебирать его до тех пор, пока не найдете первый результат с более чем 1 и выполните поиск первого ключа в исходном массиве, соответствующего этому значению.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector