最大乘積;及最新版本分析

紫鳳發表於2013-10-31

今日面試題:最大乘積

一根繩子,長度為n米。將其切成幾段,每一段的長度都是整數。請給出一種切法,使得切成的各段繩子之間的乘積是最大的。注意,最少要切一下的。

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

最新版本分析原題給定軟體的版本號的表示方式,以及一些版本號,請找出最新的版本。例如:

1. 1.2,2.2 最新的是2.2

2. 3.1, 3.1.3 最新的是3.1.3

上面的版本號,都是用字串表示的。

分析

這個題目比較簡單,可以用來考察同學們字串的處理,因為這裡強調了版本資訊都是用字串的方式儲存的,但其實處理起來也比較簡單,java、c++等語言已經提供了很好的API。如果不允許呼叫,則遍歷字串,按“.”分割,並且將字元轉化誒正數即可,後面這個也有不少面試考察,大家可以找一個OJ,練練程式碼。那麼,這個題目都有哪些方法呢?我們簡單介紹兩個。

如果是一個java或者c++的程式設計師,第一個想到的方法可能是重寫比較操作符,然後對字串整體進行快速排序,比較的方式就是我們自定義的比較操 作符,一個方法,在比較的時候,可以將字串進行按“.”劃分,對應的部分比較數字的大小。假設有n個版本號,每個版本號的長度為k,則整體的時間複雜度 為O(knlogn),其中,劃分並且逐位比較的時間複雜度為O(k)。

是否有更加高效的方法呢?因為我們要找的最新的版本(可以理解為最大的),一般來講,我們給定一個陣列,找到最大的元素,O(n)的時間複雜度就可以的。同樣,在這裡我們仍舊可以這樣處理:

1. 用對每一個版本號進行劃分,儲存為正數的list

2. 遍歷每一個list的第一個元素,找到的最大的數字,也許會有多個

3. 對於第一個數字最大的一些版本,處理第二個數字,同樣找到最大的數字,縮小進一步查詢的範圍

4. 依次類推。

這個方法的時間複雜度為O(kn)。

【分析完畢】

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

相關文章