最新版本;及加油站分析

紫鳳發表於2013-10-31

今日面試題:最新版本

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

1. 1.2,2.2 最新的是2.2

2. 3.1, 3.1.3 最新的是3.1.3

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

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

加油站分析

原題

城市的環形路有n個加油站,第i個加油站的油量用gas[i]來表示,你有如下的一輛車:

1. 它的油缸是無限量的,初始是空的

2. 它從第i個加油站到第i+1個加油站消耗油量為cost[i]

現在你可以從任意加油站開始,路過加油站可以不斷的加油,問是否能夠走完環形路。如果可以返回開始加油站的編號,如果不可以返回-1。注意,解決方案保證是唯一的。

分析這個題目其實比較簡單,只要充分的理解,我相信大家都能夠解決的。你的這輛車的油缸是無限量的,所以每個加油站的油都可以加到車裡,但是關鍵是你得 保證,你在第i站的時候,油缸中有的油量,可以支撐你到第i+1站,對於每一站都要如此,所以,並不是總的油量大於消耗量就可以了。要保證每一站都有足夠 的油可以走到下一站,到每一站,你的車的油量都大於等於0就可以了。

經過上面的分析,很顯然,暴力一點,我們每個站都試一下唄,然後找到每一站的油量都大於等於0的那個走法,返回開始的加油站;沒有就返回-1。這個解法是O(n^2)的時間複雜度。

我們通過觀察上面的暴力方法的步驟,可以發現有很大的改進空間。當我們從第0個加油站開始,判斷是否可以走完,然後從第1個加油站開始,進行判斷的 時候,其實中間的計算已經做過了。反過來,我們如果計算好了從第1個加油開始,到某一個站時,油量為tank,此時考慮從第0個開始時,到該加油站的油量 就是gas[i]-cost[i] + tank。這時隱約覺得,解決方案的時間複雜度可以是O(n)的時間複雜度。 事實上確實可以,具體的方法如下:tank表示當前車的油缸裡的油量

1. 從第0個站開始,tank += gas[0] - cost[0],只要tank>=0,我們就繼續到下一個加油站

2. 當不滿足tank>=0,順著環路試驗從前一個站開始,比如,n-1: tank += gas[n-1] - cost[n-1],如果還小於0,繼續試驗再前一個。

3. 直到滿足 tank>=0,再進行第1步,依次類推

4. 當一前一後這兩個相遇了,演算法也就結束了,tank>=0,就成功,返回相遇的位置;否則,失敗,返回-1

上面這個方法的時間複雜度是多少呢?O(n)的,很簡單,我們作為一個整體來看,每一個節點都只走了一次。

【分析完畢】

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

相關文章