给出了一个由 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;
}