找出一组数据中差值分别为最多及最小的的两个数作者:luke

本题解题思想:
排序必然是第一步,排完序之后,数组两端的基本就是相差最大的一组数据。
而相差最小的,就要把相邻的两个数组依次去相减,最后找到结果最小的一组即是答案

<?php
$r = [100,20,90,40,10,50,70,88,25.6,16];
foreach($r as &$v){  foreach($r as &$j){  if($v >= $j){  $tmp = $v;  $v = $j;  $j = $tmp;  }  }
}

print_r($r);
$max_arr = [$r[0], $r[count($r)-1]];
echo 'max:',$r[0],'-' - $r[count($r)-1],'=',$r[0] - $r[count($r)-1];
echo PHP_EOL;
$min = 0;
unset($v); // 不注释$v,下面会计算出错
// echo $v;die;
foreach($r as $k=> $v){  $k1 = $k+1;  if($k1== count($r)){   break;  }else{  $v1 = $r[$k1];  }  $tmp = $v - $v1;  // echo $k1,',',$v1,PHP_EOL;  // echo $k,': ',$v, '-', $v1,'=',$tmp,PHP_EOL;  if($min){  if($tmp<= $min){  $min = $tmp;  $min_arr = [$v,$v1];  }  }else{  $min = $tmp;  }   }
echo 'min:', $min_arr[0],'-', $min_arr[1], '=',$min;



采用array_slice、array_map和 array_splice 提供了一种非常巧妙的解法
<?php

$items_date = [100,20,90,40,10,50,70,88,25.6,16];
rsort($items_date);
$right_items = array_slice($items_date,0,-1);
$left_items = array_slice($items_date,1);

//计算两两差值,返回最小差值key
$diff_items = array_map(function($a,$b){
return $a - $b;
},$right_items,$left_items);

$keys = array_keys($diff_items,min($diff_items));//得出最小差值KEY
//最终得出两个数之差最小的两组数据为
$min_items[0] = $right_items[$keys[0]];
$min_items [1] = $left_items[$keys[0]];
print_r($min_items);//最小
 

//最终得出两个数之差最大的两组数据为
array_splice($items_date,1, -1);
print_r($items_date);//最大


function getHighLow($ary){
    if(!is_array($ary) || empty($ary)) return false;
    sort($ary);
    $total = count($ary);
    $new_arr = array();
    for($i=1;$i<$total;$i++){
        $new_arr[$i] = $ary[$i] - $ary[$i-1];
    }
    asort($new_arr);
    $ary_key = array_keys($new_arr);
    $low_key = current($ary_key);
    return array(
        'low' => array($ary[$low_key],$ary[$low_key-1]),
        'high' => array($ary[0],$ary[$total-1])
    );
}
<?php
    
$nList = [100,20,90,40,10,50,70,88,25.6 , 16];
sort($nList);
$list = [];
$min = $nList[count($nList) - 1];
$str = '';
for ($i=0; $i < count($nList); $i++) { 
    for ($j=count($nList) - 1; $j >= 0; $j--) { 
        if($nList[$i] < $nList[$j]) {
            if($nList[$j] - $nList[$i] < $min) {
                $min = $nList[$j] - $nList[$i];
                $str = "$nList[$j] , $nList[$i]";
            }
        }
    }
}
$list['相差最小的'] = $str;
$list['相差最大的'] = $nList[count($nList) - 1] . ',' . $nList[0];
<?php
    
/**
* 这里应该要注意相差最小的组合可能有多个
* @param array $arr
* @return array
*/
function findDiff($arr){
    sort($arr); 
    $brr = $arr;
    $return['max'] = array(array_shift($arr), array_pop($brr));
    $diff = array_map(function ($a, $b) {return $a-$b;}, $arr, $brr);
    $keys = array_keys($diff, min($diff));
    foreach ($keys as $k) {
        $return['min'][] = array($arr[$k], $brr[$k]);
    }
    return $return;
}

$arr = array(100, 20, 90, 40, 10, 50, 70, 88, 25.6, 16);
print_r(findDiff($arr));

时间:2018-3-23 分类:练习