Найти первый дубликат в массиве - PullRequest
0 голосов
/ 06 июня 2018

Учитывая массив 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.

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

Ответы [ 2 ]

0 голосов
/ 06 июня 2018
$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.

0 голосов
/ 06 июня 2018
// 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 и выполните поиск первого ключа в исходном массиве, соответствующего этому значению.

...