原題
給定只包含正數的數組,給出一個方法,將數組中的數拼接起來,得到的數,是最大的。 例如: [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