在数组中查找第一个副本

时间:2018-06-06 17:53:35

标签: php arrays duplicates

给定一个仅包含1到a.length范围内的数字的数组a,找到第二个匹配项具有最小索引的第一个重复数字。换句话说,如果有多于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.

如何修复代码以输出正确的结果?

5 个答案:

答案 0 :(得分: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 :(得分: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。

答案 2 :(得分:0)

Python3解决方案:

def firstDuplicate(a):
    mySet = set()
    for i in range(len(a)):
        if a[i] in mySet:
            return a[i]
        else:
            mySet.add(a[i])
    return -1

答案 3 :(得分:0)

function firstDuplicate($a) {    
    foreach($a as $index => $value) {
        $detector[] = $value;
        $counter = 0;
        foreach($detector as $item) {
            if($item == $value) {
                $counter++;
                if($counter >= 2) {
                    return $value;
                    break;
                }
            }
        }
    }
    return -1;
}

很容易就得到第一个将被检查为重复的数字,但不幸的是,这个函数对于大数组数据超过了4秒,所以请在小规模数组数据中使用它。

编辑

我有自己的新代码修复了大数组数据

的执行时间
function firstDuplicate($a) {
    $b = [];
    $counts = array_count_values($a);
    foreach($counts as $num => $duplication) {
        if($duplication > 1) {
            $b[] = $num;
        }
    }
    foreach($a as $value) {
        if(in_array($value, $b)) {
            $detector[] = $value;
            $counter = 0;
            foreach($detector as $item) {
                if($item == $value) {
                    $counter++;
                    if($counter >= 2) {
                        return $value;
                        break;
                    }
                }
            }
        }
    }
    return -1;
}

新代码仅通过使用 array_count_values()

来定位具有声誉的当前数字

答案 4 :(得分:0)

function firstDuplicate($a) {
    $indexNumber = -1;
    for($i = count($a); $i >= 1 ; --$i){
        for($k = 0; $k < $i; $k++){
          if(isset($a[$i]) && ($a[$i] === $a[$k]) ){
          $indexNumber = $a[$k]; 
        }   
        }
    }
    return $indexNumber;
}

从未定义的索引数组中删除错误。