请帮助制作php函数,检查给定的整数数组是否包含从1到N的所有序列号 . 每个数字只能在数组中出现一次 . 输出true / false .
每个数字必须是整数
每个号码必须大于前一个号码
允许使用负数 .
function testInt($ my_array){$ prevval = null;foreach($ my_array as $ val){if((filter_var($ val,FILTER_VALIDATE_INT))=== false){返回虚假;}if($ prevval!== null){if($ val <= $ prevval){返回虚假;}}$ prevval = $ val;}返回true;}
$test1 = [-1, "4", 5, 7]; $test2 = [0, 1, 2, 100]; $test3 = [1, 4, 4, 100]; $test4 = [1, 5, 4, 1000]; $test5 = [5, 6, 7, "50"]; var_dump(testInt($test1)); bool(true) var_dump(testInt($test2)); bool(true) var_dump(testInt($test3)); bool(false) var_dump(testInt($test4)); bool(false) var_dump(testInt($test5)); bool(true)
因为你说整数包含从1到N的所有序列号 . 每个数字只能在数组中出现一次这意味着如果我们将数组与range()进行比较,那么输出为true / false .如果数组未排序,您还可以包括排序 .
$arr1 = [2,1,3,4,5,6,6,7]; $arr2 = [1,2,3,4,5,6,7]; $arr3 = [1,3,4,5,6,7]; $arr4 = [1,5,6,7,4,3,2]; // sort arrays sort($arr1); sort($arr2); sort($arr3); sort($arr4); $n = 7; $range = range(1,$n); // or $range(min($array),$n); or $range(min($array),max($array)); depedning on how you want it set up var_dump($arr1 == $range); //false var_dump($arr2 == $range); //true var_dump($arr3 == $range); //false var_dump($arr4 == $range); //true
https://3v4l.org/DMe46
通过添加信息,我们可以使用array_intersect和count .Array intersect返回数组中的匹配项 .如果我们计算它们,我们会看它们是否匹配 .
$arr1 = array(2,3,1,4); $arr2 = array(2,5,3,4); $arr3 = array(1,3,4,2,5,6,3); $range1 = range(1,max($arr1)); $range2 = range(1,max($arr2)); $range3 = range(1,max($arr3)); var_dump(count($range1) == count(array_intersect($arr1, $range1))); // true var_dump(count($range2) == count(array_intersect($arr2, $range2))); // false var_dump(count($range3) == count(array_intersect($arr3, $range3))); // false
https://3v4l.org/7Hdll
有更好的方法,但我会尽量保持简单 .
如果将所有元素作为键插入新数组,则可以检查它们是否已存在于数组中 . 第二步是检查是否所有都在那里 - 你可以通过检查数组中元素的数量是否与max元素相同来做到这一点:
function checkFullArray($array) { $dic = array(); foreach($array as $elem) { if (array_key_exists($elem, $dic)) return false; $dic[$elem] = true; } return count($dic) == max($array); }
使用示例:
echo checkFullArray([1,2,3,4]). PHP_EOL; //true echo checkFullArray([3,2,1,4]). PHP_EOL; //ture echo checkFullArray([1,2,2,4]). PHP_EOL; //false echo checkFullArray([1,2,4]). PHP_EOL; //false
如果你的数组也可以包含字符串和更多没有int的人员添加check作为 foreach 循环的第一行
foreach
3 回答
每个数字必须是整数
每个号码必须大于前一个号码
允许使用负数 .
因为你说整数包含从1到N的所有序列号 . 每个数字只能在数组中出现一次
这意味着如果我们将数组与range()进行比较,那么输出为true / false .
如果数组未排序,您还可以包括排序 .
https://3v4l.org/DMe46
通过添加信息,我们可以使用array_intersect和count .
Array intersect返回数组中的匹配项 .
如果我们计算它们,我们会看它们是否匹配 .
https://3v4l.org/7Hdll
有更好的方法,但我会尽量保持简单 .
如果将所有元素作为键插入新数组,则可以检查它们是否已存在于数组中 . 第二步是检查是否所有都在那里 - 你可以通过检查数组中元素的数量是否与max元素相同来做到这一点:
使用示例:
如果你的数组也可以包含字符串和更多没有int的人员添加check作为
foreach
循环的第一行