構造最大數

原題

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章