一个不定长度的数组1.求出最大值,最小值及其位置。2.找出比两边的数都大的数的个数,输出比两边的数都小的数的值。3.在数组中搜索指定的值($target)是否存在,不存在输出不存在,存在则输出其下标。4.去掉最大值,去掉最小值,求平均值。
5.去掉数组中最小的两个数,其他的数求平均值。

解决方案 »

  1.   


       $hand = array(213,3245,556,67,43,434,42,45,654,32,46,8,9,4,32);
       $max = $min = $minSec = $avg1 = $avg2 = $hang[0];      //最大值,最小值 ,第二小值,平均值一,平均值二
       $gtBothNum = 0;                        //比两边都大的数个数
       $ltBothArr = array();                  //比两边都小的数集合
       $target  = 5;                          //指定的值,假定为5
       $hasTarget = false;                    //指定值是否存在
       $sum = $count = 0;                    //总和
       
       foreach($hand as $i=>$v){
           $count++;
           if($v > $max){
              $max = $v;
           }
           
           if($v <= $min){
               $minSec = $min;
               $min    = $v;
           }elseif($v <= $minSec){
               $minSec = $v;
           }
           
           if(isset($hand[$i-1])&& isset($hand[$i+1])){ // 假定第一个和最后一个不符合楼主要求
               if($hand[$i-1] < $v && $v < $hand[$i+1]){
                  $gtBothNum++;
               }
               if($hand[$i-1] > $v && $v > $hand[$i+1]){
                  $ltBothArr[] = $v;                    //如果楼主要输出,在这里输出就行了
               }
           }
           
           if($v == $target){
             $hasTarget = true;     //如果楼主要输出,就输出
           }
            
           $sum += $v;
       }    $avg1 = ($sum - $max - $min)/($count -2);
        $avg1 = ($sum - $minSec - $min)/($count -2);   //时间复杂度为n
       //吃饭去了 没有测试,楼主自己测试一下
      

  2.   

    不好意思,打错了两个地方
    修改后如下:$hand = array(213,3245,556,67,43,434,42,45,654,32,46,8,9,4,32);
       $max = $min = $minSec = $avg1 = $avg2 = $hand[0];      //最大值,最小值 ,第二小值,平均值一,平均值二
       $gtBothNum = 0;                        //比两边都大的数个数
       $ltBothArr = array();                  //比两边都小的数集合
       $target  = 5;                          //指定的值,假定为5
       $hasTarget = false;                    //指定值是否存在
       $sum = $count = 0;                    //总和
       $position = -1;
       foreach($hand as $i=>$v){
           $count++;
           if($v > $max){
              $max = $v;
           }
           
           if($v <= $min){
               $minSec = $min;
               $min    = $v;
           }elseif($v <= $minSec){
               $minSec = $v;
           }
           
           if(isset($hand[$i-1])&& isset($hand[$i+1])){ // 假定第一个和最后一个不符合楼主要求
               if($hand[$i-1] < $v && $v > $hand[$i+1]){
                  $gtBothNum++;
               }
               if($hand[$i-1] > $v && $v < $hand[$i+1]){
                  $ltBothArr[] = $v;                    //如果楼主要输出,在这里输出就行了
               }
           }
           
           if($v == $target){
             $hasTarget = true;     //如果楼主要输出,就输出
             $position  = $i;
           }
            
           $sum += $v;
       }    $avg1 = ($sum - $max - $min)/($count -2);
        $avg1 = ($sum - $minSec - $min)/($count -2);
         echo $min;
         echo '<br>';
         echo $minSec;
         echo '<br>';
         echo $max;
         echo '<br>';
         echo $position;
         echo '<br>';
         var_dump($ltBothArr);
      

  3.   

    其他的你自己写吧,好好看看数组的用法,其实用不着那么复杂!$data = $hand = array(213,3245,556,67,43,434,42,45,654,32,46,8,9,4,32);
    asort($data);
    echo 'MIN:',key($data),'=>',current($data),"\n";
    end($data);
    echo 'MAX:',key($data),'=>',current($data),"\n";reset($hand);
    echo 'LEFT:',key($hand),'=>',current($hand),"\n";
    end($hand);
    echo 'RIGHT:',key($hand),'=>',current($hand),"\n";//去除最大值和最小值,求平均值
    reset($data);
    //去除最大值
    $d = array_pop($data);
    //去除最小值
    arsort($d);
    $d = array_pop($d);
    //平均值
    echo array_sum($d)/count($d);
      

  4.   

    谢谢大家踊跃回帖,但我想要的是for循环的编辑方法!
    ↖(^ω^)↗
      

  5.   


    定义几个变量 for 比较 前面一个后面一个 ... ... 
      

  6.   

    请大家用for循环完整的写出来
    O(∩_∩)O谢谢