Учитывая массив 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.
Как я могу исправить свой код для вывода правильного результата?
$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.
// 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 и выполните поиск первого ключа в исходном массиве, соответствующего этому значению.