【问题标题】:Calculate at least 3 minimum and maximum numbers from array从数组中计算至少 3 个最小和最大数字
【发布时间】:2016-09-10 17:48:47
【问题描述】:

代码

<?php

    $array = array("1", "2", "3", "4", "5", "6", "7", "8", "100");
    $max = $temp = 0;
    $min = $temp = 0;

    //This loop is to get max and min value from array
    for ($i = 0 ; $i < count($array); $i++) {

        if ($i == 0) {
            $max = $temp = $array[$i];
        }

        if ($i > 0) {
            if ($array[$i] > $temp) {
                $max = $array[$i];
            }
        }

        if ($i == 0) {
            $min = $temp = $array[$i];
        }

        if ($i < 0) {
            if ($array[$i] < $temp) {
                $min = $array[$i];
            }
        }

    }

    echo "Max Number = $max <br>";
    echo "Min Number = $min";


?>

上面的代码只计算数组中的一个最小值和一个最大值。我需要它来计算 3 个最大值和 3 个最小值。

我不能使用预制函数,也不能使用多个 for 循环,所以请建议我在上面的代码中进行自定义。

【问题讨论】:

  • “最多 3 个数字”到底是什么意思?您是指最大的 3 个数字吗?
  • 什么是“预制”功能?这是为了学校项目吗?

标签: php arrays max min


【解决方案1】:

您只需要对数组进行反向排序,然后对前三个索引进行切片。您可以将其表示为一个函数:

function topThree(Array $arr) {
    // Sort the array in reverse
    rsort($arr); 
    // Return the first three indexes (top three)
    return array_slice($arr, 2);
}

rsortarray_slice

编辑:好的,这可行

/**
 * Sorts an array of numeric values from largest to 
 * smallest and returns the three highest values.
 *
 * @param  Array  $arr  An array of numeric values.
 * @return Array  $srt  The three highest values in $arr.
 */
   function topThree(Array $arr) {
    $srt = [];
    foreach($arr as $key => $val) {
        if(!$key) { 
            $srt[] = $val;
        } else if ($val < $srt[0]) { 
            array_unshift($srt, $val); 
        } else if ($val > $srt[count($srt)-1]) { 
            array_push($srt, $val);
        } else {
            for( $i=1; $i<count($srt); $i++) {
                if($val < $srt[$i]) {
                    array_splice( $srt, $i, 0, $val );
                    break;
                }
            }
        }
    }
    $max = array_slice($srt, -3, 3);
    $min = array_slice($srt, 0, 3);

    return ["min" => $min, "max" => $max];
   }


// "Test"
for($i=0; $i<20;$i++){
    $arr[]=rand(-100,100);
}

print_r($arr);
print_r(topThree($arr));

如果$val 是第一个$key $val 添加到$sort

如果$val 小于$sort[0] $val 则添加到$sort 的开头。

如果$val 大于$sort[length],则将$val 添加到$sort 的末尾。

否则,我们将检查每个 $val 与其他每个 $sort 值。当我们发现$sort[$i] 的值大于$val 时,我们将数组与$val 拼接到$i

有意义吗?

【讨论】:

  • 不能使用rsort asort等预定义函数,
  • 已修复。当然你可以使用 array_slice、push 等。
  • 如果你甚至不能使用array_splice,推送,取消移位我给你的东西,如果你从原始数组中取消设置匹配的0,最小值,最大值并使用一些递归剩余(排序中间)值。
  • 也只能在1个for循环中使用,你使用了1个以上。
  • 我没有投反对票,其他人肯定投了票。感谢您帮助队友:)
【解决方案2】:

您可以使用 if 语句处理此问题

当您在循环过程中发现除前一个之外的另一个最小/最大值时,检查最大/最小数会起作用。这是你使用的算法

假设您的 min=5 并且在循环当前索引值为 3 之后,你将不得不使 min=3

例如,将 5 分配给 min2 怎么样?

三个变量 min1、min2、min3 和嵌套 if 语句

我知道这不是最好的方法。但是你试过吗?

【讨论】:

  • 我想我忘了提到包含数字的数组将是随机的,所以我不能让程序仅限于已经定义的数字,而是它应该根据数组上的任何数字进行计算,并且应该打印 3 max和 3 分钟的数字。
  • 我想你没有明白我的意思。 min,还有两个变量用于 max,所以当你改变 max 数字的值时,你放上一个。例如max2 中的值
  • &lt;?php $array = array("1", "2", "3", "4", "5", "6", "7", "8", "100"); $max1 = $max2 = $max3= $temp = 0; for ($i = 0 ; $i &lt; count($array); $i++) { $x = $array[$i] ; if($x&gt; $max1) { $max3 = $max2; $max2 = $max1; $max1 = $x; } else if ($x&gt; $max2) { $max3 = $max2; $max2 = $x; } else if ($x&gt; $max3) { $max3 = $x; } } echo "Max Number = $max1 , $max2 , $max3 &lt;br&gt;"; ?&gt; 这是获取最多 3 个数字的示例
【解决方案3】:

这对我来说看起来很整洁。

<?php

$array = array("1", "2", "3", "4", "5", "6", "7", "8", "100");

$n1 = $n2 = $n3 = 1000 ;  // some high number
$m1 = $m2 = $m3 = 0 ;

//This loop is to get max and min value from array
for ($i = 0 ; $i < count($array); $i++) {
    $x = $array[$i] ; 
    //min        
    if ($x <= $n1){
        $n3 = $n2 ;
        $n2 = $n1 ;            
        $n1 = $x ;
    } elseif ($x < $n2){
        $n3 = $n2;
        $n2 = $x;
    } elseif ($x < $n3){
        $n3 = $x;
    }

    //max
    if ($x >= $m1){
        $m3 = $m2 ;
        $m2 = $m1 ;            
        $m1 = $x ;
    } elseif ($x > $m2){
        $m3 = $m2;
        $m2 = $x;
    } elseif ($x > $m3){
        $m3 = $x;
    }        

}

echo "Min Number = $n1 $n2 $n3<br>";
echo "Max Number = $m1 $m2 $m3";


?>

输出:

Min Number = 1 2 3
Max Number = 100 8 7

【讨论】:

  • 这很棒但是一个小问题计数功能是预制的,正如我之前提到的,我不能使用计数预制功能。有没有非预制的 count 替代方法?
  • 使用 foreach($k=>$v){.. } $k 是键 $v 是值
【解决方案4】:

这段代码运行正常

<?php

    $array = array("1", "2", "3", "4", "5", "6", "7", "8", "100");

    $max1 =$max2 =$max3= -999999999999999; // highest possible number
    $min3 = $min2= $min1 = 9999999999999999; // lowest possible number

    for ($i = 0 ; $i < count($array); $i++) {
        $x = $array[$i] ;

        //to get the max 3 numbers
       if($x>= $max1)
       {
           $max3 = $max2;
           $max2 = $max1;
           $max1 = $x;
       }
       else if ($x> $max2)
       {
           $max3 = $max2;
           $max2 = $x;
       }
        else if ($x> $max3)
        {

           $max3 = $x;
       }
       // to get the min 3 numbers
        if($x<=$min3 && $x>$min2 )
       {
           $min3 = $x;

       }
       else if ($x<$min2 && $x>$min1)
       {
           $min3 = $min2;
           $min2 = $x;
       }
        else if ( $x<$min1)
        {
           $min3 = $min2;
           $min2 = $min1;
           $min1 = $x;
        }


    }

    echo "Max Number = $max1 , $max2 , $max3 <br>";
    echo "Min Number = $min1 , $min2 , $min3";


?>

输出是

Max Number = 100 , 8 , 7 
Min Number = 1 , 2 , 3

有比这更好的方法和更有效的方法,但这需要 2 个循环,而你不希望这样!

【讨论】:

    猜你喜欢
    • 2015-12-03
    • 2020-10-14
    • 1970-01-01
    • 2015-10-29
    • 2022-10-17
    • 1970-01-01
    • 1970-01-01
    • 2018-11-19
    • 2011-04-12
    相关资源
    最近更新 更多