编写一个能将给定的非负整数列表中的数字排列成最大数字的函数
原题目如下:
编写一个能将给定非负整数列表中的数字排列成最大数字的函数。例如,给定[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>';还是得勤加学习。