找到一系列数字中的第一个缺失数字

时间:2018-01-02 19:15:55

标签: php while-loop

这是我尝试为这个问题找到解决方案的第二天。

我有一个数组。

$datas;

$datas[0]; // 8000
$datas[1]; // 8001
$datas[2]; // 8003
$datas[3]; // 8004

我必须找到从8000开始的第一个缺失号码,在这种情况下它是8002。

我的想法是像这样做一些事情:

$datas[0] +1 = $datas[1]

如果它是真正的端口,它不是免费的,我必须检查下一个,如果它是假的,它是第一个免费号码。

我知道它的语法不正确但我在以正确的方式编写它时遇到了一些问题。

5 个答案:

答案 0 :(得分:1)

从最低到最高排序(如果尚未排序),然后从最低位开始增加并检查它是否在数组中:

sort($datas); 
for($i=reset($datas); in_array($i, $datas); $i++);
echo $i;

reset得到第一个数字,在这种情况下8000开始,当in_array不在数组中时$i条件终止循环。

答案 1 :(得分:1)

您可以使用array_diff查找缺失值 我创建了一个新数组,其值从$ datas的最小值到最大$ datas进行比较 回归是缺失的。

$arr = range(min($datas),max($datas));

Var_dump(min(array_diff($arr,$datas)));

https://3v4l.org/ZmLAU

也可以是一个班轮:

Var_dump(min(array_diff(range(min($datas),max($datas)), $datas)));

答案 2 :(得分:0)

这样的事情应该起作用

for($i=0;$i<count($datas);$i++){
  if($datas[$i] + 1 != $datas[$i+1]){
    echo($datas[$i] + 1 .' IS the missing number');
  }
}

答案 3 :(得分:0)

有了类似的东西,使用foreach循环遍历数组非常简单。

foreach ($datas as $key=>$val) { 
  if ( $val +1 != $datas[$key+1] ) { 
    echo $val+1; // this is the first free value in the sequence
    }
  }

答案 4 :(得分:0)

<?php

function get($data) {
    sort($data);
    $i = 0;
    while($i < count($data) - 2) {
        if ($data[$i+1] - $data[$i] != 1) return $data[$i] + 1;
        $i++;
    }

    return $data[count($data)-1] + 1;
}

echo get([ 8000, 8001, 8003, 8004,]);
echo get([ 8000, 8001, 8002, 8003, 8004,]);
相关问题