编写一个能将给定的非负整数列表中的数字排列成最大数字的函数

DATE: 2015-08-15 / VIEWS: 7054

原题目如下:

编写一个能将给定非负整数列表中的数字排列成最大数字的函数。例如,给定[50,2,1,9],最大数字为95021。

看到题目的第一想法,是想将每个数字的第一位做数组的新键值,再做数组键值倒序(krsort),扩展这个问题,如果有重复或者后面的2、3、4……位重复怎么解决,于是乎想到了一个办法就是把每个数字长度补到和最长位,即最长那个数字的长度一样,用数字中第1位数来填充,即可达到效果,代码如下:

$g = '10,50,54,45,9,7,8,5,5,4,44,46,456';

function sum_f($g){
    $g = explode(',', $g);
    $max_num = max($g);
    $new_arr = array();
    foreach ($g as $value) {
        $index = str_pad($value,strlen($max_num),$value[0]);
        if(isset($new_arr[$index])){
            $new_arr[$index] = $new_arr[$index].$value;
        }else{
            $new_arr[$index] = $value;
        }
    }
    krsort($new_arr);
    return implode('', $new_arr);
}
echo $g.'<br>';
echo '结果:'.sum_f($g);
代码很长是不是,很非主流是不是,这就是对算法不通的结果。

这个题目如果用PHP的冒泡排序很快就能解决,不就是找最大值或最小值嘛,代码如下:

<?php
$aa = array(10,50,54,45,9,7,8,5,5,4,44,46,456);
$b = count($aa);

for ($i=0; $i < $b - 1; $i++) {
    for ($k=$b-1; $k > 0; $k--) {
        if(intval($aa[$k].$aa[$k-1]) > intval($aa[$k-1].$aa[$k])){
            $temp = $aa[$k-1];
            $aa[$k-1] = $aa[$k];
            $aa[$k] = $temp;
        }
    }
}

print_r($aa);
echo '<hr>';
又或者:

<?php
$aa = array(10,50,54,45,9,7,8,5,5,4,44,46,456);
$b = count($aa);

//外循环
for($i=0;$i<$b;$i++){
    //内循环,每次找到最小的一个值放到最后,循环的次数会依次减少
    for ($k=0; $k < $b-1; $k++) {
        //如果前面+后面的组合小于后面+前面的组合,则调换前后两个值
        if($aa[$k].$aa[$k+1] < $aa[$k+1].$aa[$k]){
            $temp = $aa[$k+1];
            $aa[$k+1] = $aa[$k];
            $aa[$k] = $temp;
        } 
    }
}

print_r($aa);
echo '<hr>';
还是得勤加学习。