原题目如下:
编写一个能将给定非负整数列表中的数字排列成最大数字的函数。例如,给定[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.'
';
echo '结果:'.sum_f($g);
代码很长是不是,很非主流是不是,这就是对算法不通的结果。
这个题目如果用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 '
';
又或者:
$aa = array(10,50,54,45,9,7,8,5,5,4,44,46,456);
$b = count($aa);
//外循环
for($i=0;$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 '
';
还是得勤加学习。