如何使用PHP解决此代码测试?

如何使用PHP解决此代码测试?,php,Php,我第一次进行了代码测试,但没有在30分钟内解决这个问题。 你能给我一个解决这个代码测试的答案吗 编写一个函数: 功能解决方案($A) 给定一个由N个整数组成的数组,返回最小的正整数 整数(大于0),该整数不在A中出现 比如说 给定A=[1,3,6,4,1,2],函数应返回5 给定A=[1,2,3],函数应返回4 给定A=[−1.−3] ,函数应返回1 为以下假设编写有效的算法: N是范围[1..100000]内的整数数组A的每个元素 是范围[−1000000..1000000] 我相信有一个

我第一次进行了代码测试,但没有在30分钟内解决这个问题。 你能给我一个解决这个代码测试的答案吗

编写一个函数:

功能解决方案($A)

给定一个由N个整数组成的数组,返回最小的正整数 整数(大于0),该整数不在A中出现

比如说

  • 给定
    A=[1,3,6,4,1,2]
    ,函数应返回
    5
  • 给定
    A=[1,2,3]
    ,函数应返回
    4
  • 给定
    A=[−1.−3] 
    ,函数应返回
    1
为以下假设编写有效的算法:

N是范围
[1..100000]内的整数数组A的每个元素
是范围
[−1000000..1000000]


我相信有一个更有效的方法来完成这件事,但这里有一些东西可以让你去做。它仍然会循环100000次,这是相当多的

function solution($array) {
    $i = 1;
    while (in_array($i, $array)) $i++;
    return $i;
}
编辑:这里有一个更优化的解决方案,它不在数组中使用

function solution($array) {
    
    // sort from smallest to largest
    sort($array);
    
    // try to find a positive break in the sequence
    $last = 0;
    if (end($array) > 0) {
        foreach ($array as $current) {
            if ($current == $last) continue; // duplicate
            if ($current != $last + 1 && $current > 0) break;
            $last = $current;
        }
    }
    
    return $last + 1;
}

不需要删除负值。在序列中搜索中断时,如果($current!=$last+1)中断,则不要中断(
$current<0
),即只需更改
0)中断,则代码>至
@kmoser如果数组中的所有值都为负值,它将不再返回1True,但看起来您还是更新了代码以减少传递次数。