这是我必须解决的问题:
给定一个元素数组,找到第一个和最少丢失的正元素,该数组可以具有重复数和负数。结果必须在屏幕上打印 例子 [-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”。>
注意:我发现一个错误,未对数组进行排序:'(
答案 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
答案 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;
}
}
?>