PHP 把数组拼成最小值,php把数组元素排成最小的数

把数组排成最小的数

QQ:15624575

/*

*算法要求:输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。

*例如输入数组{32, 321},则输出这两个能排成的最小数字32132。

*请给出解决问题的算法,并证明该算法。

*

*算法分析:要从2个以上数字中,得到所能排出的最小数,比较复杂。但是如果只有2个数,就好比较了。

*我们的方法就是:将整个分成2部分,第一部分是从第一个元素到倒数第二个元素;第二部分是最后一个元素。

*如果我们得到了第一部分能排出的最小数,那么整个数组所能排出的最小数就可以得到了。没错,大家一看就

*知道了,这里我们要用递归思想。先得出数组中前2个数,所能排出的最小数,然后将原数组中前2个数弹出数组,

*将前2个排出的最小数压入到数组的最前面,得到一个新的数组,然后再重复前面的过程。

*/

$array=array(11,0,33,441,34,9,19);

echo '得到的最小数是:'.get_min_num($array,count($array));

function get_min_num($array,$num){

if($num==1){//如果只有一个元素,直接输出

return $array[0];

}else if($num==2){//如果有2个元素,得到最小的数

$min=get_min_two($array);

return $min;//返回排出的最小数

}else if($num>2){//如果元素大于2

$min=get_min_two($array);//得到前2个元素组合的最小数

array_shift($array);//将第一个元素弹出数组

array_shift($array);//将第二个元素弹出数组

array_unshift($array,$min);//将前2个数得到的最小数压入到数组最前面

return get_min_num($array,count($array));//递归返回

}

}

function get_min_two($array){

$ff=substr($array[0],0,1);//得到数组第一个元素的最高位数字

$ss=substr($array[1],0,1);//得到数组第二个元素的最高位数字

if($ff

$min=$array[0].$array[1];//那么最小的数就是第一个数连接第二个数

}else if($ff

$min=$array[1];//那么最小的数就是第二个元素,忽略形如'01'这样的字符串

}else if($ff>$ss&&$ss){//如果第一个元素的最高位大于第二个元素的最高位

$min=$array[1].$array[0];//那么最小的数就是第二个数连接第一个数

}else if($ff>$ss&&!$ss){//如果第一个元素的最高位小于第二个元素的最高位,但是第二个元素为0

$min=$array[0];//那么最小的数就是第一个元素,忽略形如'01'这样的字符串

}else if($ff==$ss){//如果第一个元素的最高位等于第二个元素的最高位

$fl=substr($array[0],-1);//得到数组第一个元素的最低位数字

$sl=substr($array[1],-1);//得到数组第二个元素的最低位数字

if($fl

$min=$array[0].$array[1];//那么最小的数就是第一个数连接第二个数

}else if($fl>$sl){//如果第一个元素的最低位大于第二个元素的最低位

$min=$array[1].$array[0];//那么最小的数就是第二个数连接第一个数

}else if($fl==$sl){//如果第一个元素的最低位等于第二个元素的最低位

$min1=$array[0].$array[1];

$min2=$array[1].$array[0];

if($min1>=$min2)

$min=$min2;

else

$min=$min1;

}

}

return $min;

}

?>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值