找出一组数据中差值分别为最多及最小的的两个数
本题解题思想:
排序必然是第一步,排完序之后,数组两端的基本就是相差最大的一组数据。
而相差最小的,就要把相邻的两个数组依次去相减,最后找到结果最小的一组即是答案
排序必然是第一步,排完序之后,数组两端的基本就是相差最大的一组数据。
而相差最小的,就要把相邻的两个数组依次去相减,最后找到结果最小的一组即是答案
<?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;
<?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));