用于查找数组的第一个覆盖前缀的 PHP 代码


PHP code to find first covering prefix of an array

给出了一个由 N 个整数组成的非空零索引数组 A。数组 A 的第一个覆盖前缀是最小的整数 P,使得 $0 ''leq P

例如,数组 A 的第一个覆盖前缀使得

A[0]=2   A[1]=2   A[2]=1   A[3]=0   A[4]=1

为 3,因为序列A[0], A[1], A[2], A[3]等于 2, 2, 1, 0 包含数组 A 中出现的所有值。

编写函数

int ps(int[] A);

给定一个由 N 个整数组成的零索引非空数组 A 返回 A 的第一个覆盖前缀$N <= 1,000,000$。假设数组中的每个元素都是范围为 [0..N-1] 的整数。

例如,给定数组 A,这样A[0]=2 A[1]=2 A[2]=1 A[3]=0 A[4]=1

该函数应返回 3,如上例中所述。

这是一个非常简短的解决方案。漂亮,但不会很好地扩展。

function ps($A) {
    $cp = 0; // covering prefix
    $unique = array_unique($A); // will preserve indexes
    end($unique); // go to end of the array
    $cp = key($unique); // get the key
    return $cp;
}

这是一个简单的方法:

function covering_prefix ( $A ) {
    $in=array();
    $li=0;
    $c=count($A);
    for($i=0 ;$i<$c ; $i++){
        if (!isset($in[$A[$i]])){
           $in[$A[$i]]='1';
           $li=$i;
        }
    }
    return $li;
}

这是一个使用 ruby 的解决方案

def first_covering_prefix(a)
    all_values = a.uniq
    i = 0
    a.each do |e|
        all_values.delete(e)
        if all_values.empty?
            return i
        end
        i = i + 1
    end
end
这是一个

83%的答案,因为使用了in_array,这是罗南已经提出的更好的解决方案

function solution($A) {
    // write your code in PHP5
    $in=array();
    $li=0;
    for ($i=0; $i < count($A); $i++) { 
        # code...
        if (!in_array($A[$i], $in)){
            $in[]=$A[$i];
            $li=$i;
        }
    }
    return $li;
}