如何在 php 中获得大于 0 的最小正值
How to get minimum positive value greater then 0 in php
我想从数组中找到最小值,然后从所有元素中减去该值,直到所有元素都变为 0。问题是,如果数组包含一个元素为 0,则它不会反映任何内容.提前致谢。
<?php
$handle = fopen ("php://stdin","r");
fscanf($handle,"%d",$n);
$arr_temp = fgets($handle);
$arr = explode(" ",$arr_temp);
array_walk($arr,'intval');
for($j=0;$j<10;$j++)
{
$min = min($arr);
for($i=0;$i<count($arr);$i++)
{
if($arr[$i]>=$min)
$arr[$i]-=$min;
echo $arr[$i]." ";
}
echo "\n";
}
?>
我对 php 了解不多,但在第一个 for
循环中,您应该检查数组的元素是否为零或不使用 if 语句,例如 if(arr[j]!=0)
for($j=0;$j<10;$j++)
{
if($arr[$j]!=[=10=])
$min = min($arr);
for($i=0;$i<count($arr);$i++)
{
if($arr[$i]>=$min)
$arr[$i]-=$min;
echo $arr[$i]." ";
}
echo "\n";
}
这是因为你每次都取 $min = min($arr);
值,它变成了 0,这就是你的代码不起作用的原因。
试试下面的代码
$min = min($arr);
for($j=0;$j<=100;$j++)
{
if (count(array_unique($arr)) === 1 && end($arr) === 0) {
break;
}
for($i=0;$i<count($arr);$i++)
{
if($arr[$i] >= $min){
$arr[$i]-=$min;
echo $arr[$i]." ";
}
}
echo "<br>";
}
使用array_filter(),加上一个函数,即使数组包含值为零的元素,也可以得到最小正非零整数,如下所示:
<?php
$arr = array(0, 1, 2, 3, 4, 0, 5, 6, 4, 3, 2, 1,0);
function getMin( $a ) {
$arr_filtered = array_values(array_filter( $a ));
return min($arr_filtered);
}
$min = getMin( $arr );
$count = count($arr);
while( count( array_unique($arr) ) > 1 ) {
for( $i = 0; $i < $count; $i++)
{
if( $arr[$i] >= $min ){
$arr[$i] -= $min;
echo $arr[$i]." ";
}
}
echo "\n";
}
见demo
请注意,代码使用 array_values() 在 getMin() 中重新索引过滤后的数组。
只要最小值是1,上面的脚本就可以正常工作。但是,如果最小值是另一个数字,则需要调整代码。以下脚本处理由四个数组组成的多维数组,每个数组具有不同的最小值,其中一个具有负值:
<?php
error_reporting(E_ALL);
$a = [ [0,1, 2, 3, 4, 0, 5, 6, 4, 3, 2, 1,0],
[0, 2, 3, 4, 0, 5, 6, 4, 3, 2, 0],
[0, 3, 4, 0, 5, 6, 7,8,4, 3, 0],
[-1,0,1,2,3,4,2,1,0,-1]
];
function getMin( $a ) {
return min($a);
}
foreach ($a as $arr) {
while( ( $arr != null ) ) {
$arr = array_values(array_filter($arr));
if ($arr == null) {
break;
}
$min = getMin( $arr );
foreach ($arr as &$e) {
$e -= $min;
}
unset($e);
echo join(" ",$arr),"\n";
}
echo "\n";
}
见demo
请注意,第二个脚本明确过滤掉每个数组中的零值,而第一个脚本 有效地 这样做。这两个脚本之间的主要区别在于 getMin() 需要在 while 循环中,以便在最小数大于 1 或为负数时正确地进行减法。
该脚本还通过多种方式简化了代码。 while 循环的条件要简单得多——只要数组不为空就有效。代码不再需要 getCount(),因为我将减法循环更改为使用带有参考变量的 foreach,该参考变量随后未设置——这样做很重要,可以避免出现问题。此 foreach 循环也不需要第一个脚本的 if 条件。
我想从数组中找到最小值,然后从所有元素中减去该值,直到所有元素都变为 0。问题是,如果数组包含一个元素为 0,则它不会反映任何内容.提前致谢。
<?php
$handle = fopen ("php://stdin","r");
fscanf($handle,"%d",$n);
$arr_temp = fgets($handle);
$arr = explode(" ",$arr_temp);
array_walk($arr,'intval');
for($j=0;$j<10;$j++)
{
$min = min($arr);
for($i=0;$i<count($arr);$i++)
{
if($arr[$i]>=$min)
$arr[$i]-=$min;
echo $arr[$i]." ";
}
echo "\n";
}
?>
我对 php 了解不多,但在第一个 for
循环中,您应该检查数组的元素是否为零或不使用 if 语句,例如 if(arr[j]!=0)
for($j=0;$j<10;$j++)
{
if($arr[$j]!=[=10=])
$min = min($arr);
for($i=0;$i<count($arr);$i++)
{
if($arr[$i]>=$min)
$arr[$i]-=$min;
echo $arr[$i]." ";
}
echo "\n";
}
这是因为你每次都取 $min = min($arr);
值,它变成了 0,这就是你的代码不起作用的原因。
试试下面的代码
$min = min($arr);
for($j=0;$j<=100;$j++)
{
if (count(array_unique($arr)) === 1 && end($arr) === 0) {
break;
}
for($i=0;$i<count($arr);$i++)
{
if($arr[$i] >= $min){
$arr[$i]-=$min;
echo $arr[$i]." ";
}
}
echo "<br>";
}
使用array_filter(),加上一个函数,即使数组包含值为零的元素,也可以得到最小正非零整数,如下所示:
<?php
$arr = array(0, 1, 2, 3, 4, 0, 5, 6, 4, 3, 2, 1,0);
function getMin( $a ) {
$arr_filtered = array_values(array_filter( $a ));
return min($arr_filtered);
}
$min = getMin( $arr );
$count = count($arr);
while( count( array_unique($arr) ) > 1 ) {
for( $i = 0; $i < $count; $i++)
{
if( $arr[$i] >= $min ){
$arr[$i] -= $min;
echo $arr[$i]." ";
}
}
echo "\n";
}
见demo
请注意,代码使用 array_values() 在 getMin() 中重新索引过滤后的数组。
只要最小值是1,上面的脚本就可以正常工作。但是,如果最小值是另一个数字,则需要调整代码。以下脚本处理由四个数组组成的多维数组,每个数组具有不同的最小值,其中一个具有负值:
<?php
error_reporting(E_ALL);
$a = [ [0,1, 2, 3, 4, 0, 5, 6, 4, 3, 2, 1,0],
[0, 2, 3, 4, 0, 5, 6, 4, 3, 2, 0],
[0, 3, 4, 0, 5, 6, 7,8,4, 3, 0],
[-1,0,1,2,3,4,2,1,0,-1]
];
function getMin( $a ) {
return min($a);
}
foreach ($a as $arr) {
while( ( $arr != null ) ) {
$arr = array_values(array_filter($arr));
if ($arr == null) {
break;
}
$min = getMin( $arr );
foreach ($arr as &$e) {
$e -= $min;
}
unset($e);
echo join(" ",$arr),"\n";
}
echo "\n";
}
见demo
请注意,第二个脚本明确过滤掉每个数组中的零值,而第一个脚本 有效地 这样做。这两个脚本之间的主要区别在于 getMin() 需要在 while 循环中,以便在最小数大于 1 或为负数时正确地进行减法。
该脚本还通过多种方式简化了代码。 while 循环的条件要简单得多——只要数组不为空就有效。代码不再需要 getCount(),因为我将减法循环更改为使用带有参考变量的 foreach,该参考变量随后未设置——这样做很重要,可以避免出现问题。此 foreach 循环也不需要第一个脚本的 if 条件。