如何检查数组的数字是连续的并打印丢失的数字,以便它们是连续的?的PHP

时间:2019-01-21 01:48:09

标签: php arrays sorting

这是我必须解决的问题:

给定一个元素数组,找到第一个和最少丢失的正元素,该数组可以具有重复数和负数。结果必须在屏幕上打印 例子 [-1,9,0,8]应该打印:1 [1,2,3,4,1,2,3,5,6,3,13,4,6,5,-1,-2]应该打印:7

这是我的代码:

$numeros = array(1, 3, 6, 4);
sort($numeros);
$contador = 1;
foreach ($numeros as $numero)
{
  $numero1 - 1;
  if($contador != 1 && $numero1 = $numero-1)
  {
    $resultado[] = $numero+1;
    echo $resultado[0];
    break;
  }

$i++;
$contador++;

}

问题是对于“ if”,条件为“ $ contador!= 1”的第二个值被忽略了。 在此代码中,将打印3,但由于必须排序(-3、1、2、4),因此必须打印-2,并且数字不连续的第一种情况为“ -3,1”。

注意:我发现一个错误,未对数组进行排序:'(

2 个答案:

答案 0 :(得分:1)

此功能将为您提供所需的结果。首先,它使用array_filter去除负数,然后生成array_unique,生成所有唯一的正值(因为您只要求缺失的最小数)。然后,它遍历其余元素,寻找一个不等于前一个元素+ 1的元素。如果所有元素都是连续的,则返回false。

function find_missing($numeros) {
    $numeros = array_filter(array_unique($numeros), function ($v) { return $v >= 0; });
    sort($numeros);
    for ($i = 1; $i < count($numeros); $i++) {
        if ($numeros[$i] != $numeros[$i-1] + 1) {
            return $numeros[$i-1] + 1;
        }
    }
    // all numbers consecutive
    return false;
}

您可以这样称呼它:

$m = find_missing(array(1, 3, 6, 4));
echo ($m === false) ? "array is consecutive\n" : "$m is the first missing number\n";
$m = find_missing(array(-1,9, 0, 8));
echo ($m === false) ? "array is consecutive\n" : "$m is the first missing number\n";
$m = find_missing(array(1,2,3,4,1,2,3,5,6,3,13,4,6,5, -1, -2));
echo ($m === false) ? "array is consecutive\n" : "$m is the first missing number\n";

输出:

2 is the first missing number 
1 is the first missing number 
7 is the first missing number

Demo on 3v4l.org

答案 1 :(得分:1)

首先,您只能选择唯一值。然后对它进行排序。如果有冗余数据,它将是有效的。现在只需运行一个循环。将检查变量定义为最小的正整数。首先,如果该数字小于零,则继续。如果检查在数组中,则继续并增加检查。否则,将其打印并中断循环。

<?php
$numeros = array(1, 3, 6, 4);
$newArray = array_unique($numeros);
sort($newArray);
$check = 1;
foreach($newArray as $new){
    if($new<=0){
        continue;
    }
    if(in_array($check,$newArray)){
        $check++;
        continue;
    }else{
        echo $check;
        break;
    }
}
?>