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

原题目如下:

编写一个能将给定非负整数列表中的数字排列成最大数字的函数。例如,给定[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 '


';

还是得勤加学习。

f25b49c77ea4aa1d273601e274424f47.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值