给定一组数字,我需要以产生最大值的方式排列它们。
例如,如果给定的数字是{3,1,13,34,8},则排列8343131给出最大值。如果给定的数字是{1,34,3,98,9,66,45,4},则排列998764543431给出最大值。
$array = array("3", "1", "13", "34", "8");
需要输出如下
OUTPUT:
8343131
使用PHP我该如何实现?
答案 0 :(得分:0)
Find all possible combination并找到max
function permute($arg) {
$array = is_string($arg) ? str_split($arg) : $arg;
if(1 === count($array))
return $array;
$result = array();
foreach($array as $key => $item)
foreach(permute(array_diff_key($array, array($key => $item))) as $p)
$result[] = $item . $p;
return $result;
}
$array = array("3", "1", "13", "34", "8");
echo max(permute($array));
输出为: 8343131
答案 1 :(得分:0)
我认为你想要的是使用数组中字符串的数字来创建最大可能的数字。
实现此目的的最简单方法是创建一个包含所有数字的数组,并从最高到最低排序,然后使用这些数字创建一个数字:
$array = array("3", "1", "13", "34", "8");
$tmp = array();
foreach ($array as $i)
$tmp = array_merge($tmp, str_split($i, 1));
rsort($tmp, SORT_NUMERIC);
$maxNumber = implode('', $tmp);
这将输出8433311,这是所提供字符串数字的最大数字。
答案 2 :(得分:0)
不需要检查所有排列。我认为这可以在 O(knlog(n))时间内解决,其中 n 是数组大小, k 是字符数在最长的字符串中。
这个想法是应该首先通过填充字符串对字符串进行排序,这样所有字符串都具有相同的长度。填充应该通过在必要时多次重复原始字符串然后剪切到公共长度来实现。当该长度被认为是最大字符串的双倍长度时,结果将是正常的。
以此输入为例:
["1", "1112", "11121", "111230", "385", "38530"]
然后算法将扩展这些字符串如下:
["111111111111","111211121112","111211112111","111230111230","385385385385","385303853038"]
按降序排序,给出:
["385385385385","385303853038","111230111230","111211121112","111211112111","111111111111"]
转换回原始值:
["385", "38530", "111230", "1112", "11121", "1"]
给出了结果:
"385385301112301112111211"
以下是代码:
$array = ["1", "1112", "11121", "111230", "385", "38530"];
$maxlen = 2 * max(array_map('strlen', $array));
$padded = array_map(function ($a) use ($maxlen) {
return substr(str_repeat($a, ceil($maxlen / strlen($a))), 0, $maxlen);
}, $array);
array_multisort($padded, SORT_DESC, $array);
$result = implode("", $array);
echo $result;
与接受的答案不同,对于具有多个值的数组,这也适用于合理的时间:
查看它在eval.in上运行输入:
["3", "1", "7", "8", "9", "2", "4", "6", "5", "0", "15", "29", "32", "41",
"551", "56", "671", "6713", "782", "7820", "88", "880", "91", "9121"]
输出:
991912188888078278207671671365655514413322921510