相伴一生;及構造最大數分析

紫鳳發表於2013-07-24

今日面試題:相伴一生

給定一個陣列,陣列中只包含0和1。請找到一個最長的子序列,其中0和1的數量是相同的。

例1:10101010 結果就是其本身。

例2:1101000 結果是110100

請大家展開自己的思路。

=========================

構造最大數分析

原題

給定只包含正數的陣列,給出一個方法,將陣列中的數拼接起來,得到的數,是最大的。 例如: [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兩個數字的大小即可。只是比較發生了變化,剩下的和快排都是一樣的。

相比較而言,後面這種方法,更簡單易懂一些,而且,看上去要美很多,但是確不容易那麼直接的想到。我們在平時積累的過程中,就要嘗試多多的方法,即使看起來不那麼美的方法,這些思路的開拓,會幫助我們舉一反三,幫助我們在遇到新的題目的時候,遊刃有餘。

【分析完畢】

本文來自微信:待字閨中,2013-07-20釋出,原創@陳利人 ,歡迎大家繼續關注微信公眾賬號“待字閨中”。

相關文章