Posted by & filed under 每日一题.

【四脚猫】每日一题(2015年04月09日):有一组数 100,20,90,40,10,50,70,88,25.6 , 16 ,请用最简洁的方法找出两个数之差最大和两个数之差最小的两组数据。

本题解题思想:
排序必然是第一步,排完序之后,数组两端的基本就是相差最大的一组数据。
而相差最小的,就要把相邻的两个数组依次去相减,最后找到结果最小的一组即是答案。
本题虽然不难,但是非常考验算法功底,我们一起来看下各路大神的精彩解法吧:

PS:田小成是一个非常机智的小伙 :) 看评论就知道了

刘建勋采用array_slice、array_map和 array_splice 提供了一种非常巧妙的解法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?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);//最大

千里不亏是算法功底深厚的高手,计算最小差值的代码非常简洁!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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])
    );
}

看谁的长为了计算最小差值,采用了独特的一种思路,看来是数学高手!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?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];

Diven思想果然更进一步,代码简洁,而且考虑到多种可能!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?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));

欢迎各位攻城狮,各位大牛给每日一题投稿,大家可以把自己碰到的有趣问题,工作中碰到的难题等…发送到 稿件邮箱:2313427189@qq.com