【问题标题】:how to find highest and second highest number in an array without using max function如何在不使用 max 函数的情况下找到数组中的最高数和第二高数
【发布时间】:2014-10-19 08:33:43
【问题描述】:

我已经有了解决办法。但我认为它会更优化。所以请给我一个解决方案。并记住不要使用 php 的预定义函数。像 max() 函数。 我知道有很多方法可以找到它,但我想要最好和更好的解决方案。因为我的数组包含超过 10 万条记录,而且需要很多时间。或者有时网站会关闭。

我的代码:

<?php 

$array = array('1', '15', '2','10',4);

echo "<pre>";
print_r($array);
echo "<pre>";
$max = 0;
$s_max=0;

for($i=0; $i<count($array); $i++)
{
    $a = $array[$i];
    $tmax = $max;
    $ts_max = $s_max;
    if($a > $tmax && $a > $ts_max)
    {
        $max = $a;
        if($tmax > $ts_max) {
            $s_max = $tmax;
        } else {
            $s_max = $ts_max;
        }
    } else if($tmax > $a && $tmax > $ts_max)
    {
        $max = $tmax;
        if($a > $ts_max) {
            $s_max = $a;
        } else {
            $s_max = $ts_max;
        }
    } else if($ts_max > $a && $ts_max > $tmax)
    {
        $max = $ts_max;
        if($a > $tmax)
        {
            $s_max = $a;
        } else {
            $s_max = $tmax;
        }
    }
}
echo "Max=".$max;
    echo "<br />";
    echo "S_max=".$s_max;
    echo "<br />";

?>

【问题讨论】:

  • 作业问题?
  • 数组中可以有重复值吗?另外,你到底为什么不想使用内置函数?
  • 是的,鲍勃·布朗,你是对的。
  • 您的代码看起来过于复杂...您将如何使用笔和纸来完成?尝试想象它,然后在代码中实现它。
  • 抄袭别人的作品叫作弊。如果你无法想出一个创造性的方法来解决这个问题,那么也许你应该选择其他的东西来学习。

标签: php arrays


【解决方案1】:
<?php 
$array = array('200', '15','69','122','50','201');
$max_1 = $max_2 = 0;

for ($i=0; $i<count($array); $i++) {
    if ($array[$i] > $max_1) {
      $max_2 = $max_1;
      $max_1 = $array[$i];
    } else if ($array[$i] > $max_2 && $array[$i] != $max_2) {
      $max_2 = $array[$i];
    }
}
echo "Max=".$max_1;
echo "<br />"; 
echo "Smax 2=".$max_2;

【讨论】:

    【解决方案2】:

    查看此解决方案。

    <?php 
    
     $numbers = array_unique(array(1,15,2,10,4)); 
    // rsort : sorts an array in reverse order (highest to lowest).
    
     rsort($numbers); 
    
     echo 'Highest is -'.$numbers[0].', Second highest is -'.$numbers[1];
    
     // O/P: Highest is -15, Second highest is -10
     ?>
    

    【讨论】:

    • 不使用php函数?
    【解决方案3】:

    我没有检查您的解决方案,但就复杂性而言,它是 IMO 最佳的。如果数组没有更多的结构信息(如已排序),则无法跳过条目。 IE。最好的解决方案是您的解决方案所在的 O(n)。

    【讨论】:

      【解决方案4】:

      这是从数组中找出第二大值的完美且最短的代码。如果数组只包含一个值,下面的代码将始终返回值。

      Example 1.
          $arr = [5, 8, 1, 9, 24, 14, 36, 25, 78, 15, 37];
          asort($arr);
          $secondLargestVal = $arr[count($arr)-1];
      
          //this will return 37
      
      Example 2.
      
          $arr = [5];
          asort($arr);
          $secondLargestVal = $arr[count($arr)-1];
          //this will return 5
      

      【讨论】:

      • 没关系!如果数组中只有 2 个值,我认为我们可以 $arr[count($arr)-2]。我希望它有意义
      • 请解释更多。
      • 用native好,但是面试的时候我不接受这种回答。
      • 是的,你是对的,但是这个人问了最好的解决方案,作为编程,考虑执行时间、内存消耗和未来的修复也很重要,实际上这种做法是最好的,因为如果代码很短,这意味着您可以更轻松地更稳定地进行修复。所以这种事情取决于你有多聪明,通过稳定的编码来提高自己的生产力,而不是创建一个没有在所有方面都经过全面测试的程序。
      【解决方案5】:

      “Kanishka Panamaldeniya”给出的答案对于最高值很好,但会在第二高的值上失败,即如果数组有 2 个相似的最高值,那么它将显示最高值和第二高值相同。我已经通过添加一个级别比较对其进行了整理,并且效果很好。

      $array = array(50,250,30,250,40,70,10,50); // 250  2-times
      $max=$max2=0;
      for ($i = 0; $i < count($array); $i++) {
      if ($array[$i] > $max) {
          $max2 = $max;
          $max = $array[$i];
      } else if (($array[$i] > $max2) && ($array[$i] != $max)) {
          $max2 = $array[$i];
      }
      }
      echo "Highest Value is : " . $max . "<br/>"; //output : 250
      echo "Second highest value is : " . $max2 . "<br/>"; //output : 70
      

      【讨论】:

        【解决方案6】:
        $array = array(80,250,30,40,90,10,50,60,50);            // 250  2-times
        $max=$max2=0;
        
        foreach ($array as $key =>$val) {
        
            if($max < $val) {
                $max2 =$max;
                $max = $val;        
            }
        
            elseif(($max2 < $val) && ($max!=$val) {
                $max2 = $val;
            }
        }
        
        echo "Highest Value is : " . $max . "<br/>";           //output: 250
        echo "Second highest value is : " . $max2 . "<br/>";   //output: 90
        

        【讨论】:

        • 您好,您应该更好地格式化您的代码,并在其中包含一些 cmets
        【解决方案7】:

        此代码将从数组中返回第二个最大值

        $array = array(80,250,30,250,40,90,10,50,60,50); // 250  2-times
        $max=$max2=0;
        
        for ($i = 0; $i < count($array); $i++) {
            if($i == 0) {
                $max2 = $array[$i];
            }
             
            if($array[$i] > $max) {
                $max = $array[$i];
            }
            
            if($max > $array[$i] && $array[$i] > $max2) {
                $max2 = $array[$i];
            }
        }    
        
        
        echo "Highest Value is : " . $max . "<br/>"; //output : 250
        echo "Second highest value is : " . $max2 . "<br/>"; //output : 90
        

        【讨论】:

          【解决方案8】:

          您还可以使用冒泡排序等技术进行排序

          function bubble_Sort($my_array )
          {
              do
              {
                  $swapped = false;
                  for( $i = 0, $c = count( $my_array ) - 1; $i < $c; $i++ )
                  {
                      if( $my_array[$i] > $my_array[$i + 1] )
                      {
                          list( $my_array[$i + 1], $my_array[$i] ) =
                                  array( $my_array[$i], $my_array[$i + 1] );
                          $swapped = true;
                      }
                  }
              }
              while( $swapped );
          return $my_array;
          }
          
          $test_array = array(3, 0, 2, 5, -1, 4, 1);
          echo "Original Array :\n";
          echo implode(', ',$test_array );
          echo "\nSorted Array\n:";
          echo implode(', ',bubble_Sort($test_array)). PHP_EOL;
          
          Original Array :                                                    
          3, 0, 2, 5, -1, 4, 1                                                
          Sorted Array :                                                      
          -1, 0, 1, 2, 3, 4, 5
          

          流程说明

          【讨论】:

            【解决方案9】:

            查看这个解决方案,PHP 在没有内置排序功能的情况下查找给定数组中的第二大元素

            <?php
            
            function secondLargest($array){
                for($i=0; $i<count($array); $i++){
                    for($j=0; $j<count($array)-1; $j++){
                        if($array[$j] > $array[$j+1]){
                        $temp = $array[$j+1];
                        $array[$j+1] = $array[$j];
                        $array[$j] = $temp;
                        }
                    }
                }
              return $array[sizeof($array)-2];
            }
            
            $arr = [-1, 8, 4, 2, 8];
            print_r(secondLargest($arr));
            ?>
            
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-08-09
              • 1970-01-01
              • 1970-01-01
              • 2022-01-05
              • 2021-12-25
              • 2021-05-14
              相关资源
              最近更新 更多