求数组中元素组合的最大字符串(转)

巧了我就是萌 提交于 2019-11-30 21:43:43

原文链接:https://www.fanhaobai.com/2017/04/array-form-max-string.html

题目

给定一个所有元素为非负的数组,将数组中的所有数字连接起来,求最大的那个数。

示例:
输入:

4,94,9,14,1 

输出:

9944141 

输入:

121,89,98,15,4,3451 

输出:

98894345115121 

解题思路

  • 比较规则:分析 a 和 b 的排列,因为这 2 个数存在 2 种排列情况,既 a_bb_a,若 a_b 组合值大于 b_a 组合,那么认为 a “大于” b,则 a 需要排列在 b 前面,反之则需要交换 a 和 b 的位置。同我们熟悉的排序算法唯一不同的是,这里不是直接通过比较 2 个元素值大小,而是需要通过排列后的 2 个新值进行大小比较。
  • 排序算法:由于只是比较规则的不同,所以常用的排序算法(冒泡、快速、堆)一样适用。

这里使用冒泡排序来进行说明,每一趟找出待排序元素的最小值,算法执行流程如下:



编码实现

定义比较规则,ab 和 ba 组合后的数字进行值大小的比较:

123456
function ($a, $b) {    if ($a == $b) {        return 0;    }    return $a . $b > $b . $a ? -1 : 1;}

接收输入并输出结果:

123456789101112
function array_form_max_str(array $Arr) {    foreach ($Arr as $value) {        if ($value < 0) {            return '';        }    }    usort($Arr, "cmp");        return implode('', $Arr);}//输入:4,94,9,14,1echo array_form_max_str(explode(',', $input)), PHP_EOL;

原文:大专栏  求数组中元素组合的最大字符串(转)


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!