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