构造最大数

原题

给定只包含正数的数组,给出一个方法,将数组中的数拼接起来,得到的数,是最大的。 例如: [4, 94, 9, 14, 1] 拼接之后,所得最大数为:9944141

分析

初看这个题目,肯定是要排序的。按照从左到右的第一个位置的数字,从大到小进行排序。如题目中的例子,结果是:

94 9 4 14 1

直接拼接为9494141显然不是最大的。那很自然的想法,就是考虑从左到右第二位的数字。考虑9和94的第二个数字,9没有第二个数字如何处理?这里有一个小技巧,就是用9补位。为什么用9呢?994>949,因为4<9,所以,拼接的方式 9 + “” + 94. 为了方便我们排序,所以用9进行了补位。

再看一个例子:56,54,5。第一次排序结果为:

56 54 5
 

第二次呢?

56 55 54
 

此时要注意,第二55,是由5补位而来的。

再看一个复杂一点的例子,包含了:1位数,2位数,3位数:96 9 95 556 56 55 5 554 54 3 2 1

第一次排序:

96 9 95 556 56 55 5 554 54 3 2 1
96 9 95 556 56 55 5 554 54 3 2 1
 

第二次排序:

9 96 95 56 556 55 5 554 54 3 2 1
99 96 95 56 556 55 55 554 54 3 2 1
 

上面一行,是原始数字,下面一行,经过补位了。

第三次排序

9 96 95 56 556 55 5 554 54 3 2 1
99 96 95 565 556 555 555 554 545 3 2 1

第四次排序

9 96 95 56 556 55 5 554 54 3 2 1
99 96 95 565 556 555 555 554 545 3 2 1
 

处理最后三个个位数即可。则最终的结果是: 996955655655554554321

上面的算法,排序处理自左向右第一位,然后处理第二位,一次类推,如果某一组内,即第一个数字相同的一组,长度不同时,采用第一位进行补位。

一个巧妙的方法

我们在上面的方法中,相当于,比较两个数字的时候,把两个数字拆开,逐位进行比较。那我们接下来,就是将这两个数字,作为一个整体,进行比较。然后一次排序,就得到了结果。给定例子:5,54,56

比较5和54,实际上就是比较545和554哪个大

比较5和56,实际上就是比较556和565哪个大

比较54和56,实际上就是比较5456和5654哪个大

那我们对快排程序做一下变化,当两个数字a和b进行比较时,比较的是ab和ba两个数字的大小即可。只是比较发生了变化,剩下的和快排都是一样的。

相比较而言,后面这种方法,更简单易懂一些,而且,看上去要美很多,但是确不容易那么直接的想到。我们在平时积累的过程中,就要尝试多多的方法,即使看起来不那么美的方法,这些思路的开拓,会帮助我们举一反三,帮助我们在遇到新的题目的时候,游刃有余。

From: http://www.ituring.com.cn/article/50249

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值