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

时间:2011-04-03 18:25:22

标签: php

给出了由N个整数组成的非空零索引数组A.数组A的第一个覆盖前缀是最小的整数P,使得$ 0 \ leq P< N $并且数组A中出现的每个值也按顺序出现$ A [0],A [1],\ ldots,A [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);

给定零索引的非空数组A由N个整数组成,返回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,如上例所示。

4 个答案:

答案 0 :(得分:1)

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

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;

}

答案 1 :(得分:1)

这是一个简单的方法:

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;
}

答案 2 :(得分:0)

这是使用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

答案 3 :(得分:0)

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

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;
}