括號匹配;及找數字續分析

紫鳳發表於2013-09-17

今日面試題:括號匹配

給定字串,輸出括號是否匹配,例如,

1. "()" yes;

2. ")(" no;

3. "(abcd(e)" no;

4. "(a)(b)" yes。

要求必須用遞迴寫,整個實現不可以出現一個迴圈語句。

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

找數字續分析

原題

一個陣列A,數字出現的情況,只有以下三種:

1. 一些數字只出現一次

2. 一些數字出現兩次

3. 只有一個數字出現三次

請給出方法,找到出現三次的數字。

分析

這個題目和“找數字”的題目比較相似,但是解法上類似麼?之前的解法是檢查某一位上的1的和,是否能夠被3整除,因為整數是32位的,可以開闢一個 32位大小的陣列,這也是常數空間的。那麼這個題目可以用這個方法來解決麼?因為有不確定個數的數字出現了一次,這樣可以產生的餘數的種類也就比較多了。 那該怎麼處理呢?

hashmap的方法被稱為萬金油,在犧牲了空間的條件下,很好的達到了O(n)的時間複雜度。

如果要求常數空間的解法呢?之前的文章也有討論,快排的時間複雜度是O(nlogn),然後遍歷一遍,找到連續三個相同的數字。後面這一遍遍歷,可以省去,因為出現三次的數字只有一個。但總的時間複雜度仍是O(nlogn)。

是否還有其他的方法呢?有的同學給出瞭如下的方法:可以取得A中所有數字的乘積p,我們假設p沒有溢位。這是遍歷陣列中的每一個元素A[i],檢視 是否p % (A[i] * A[i] * A[i]) == 0,但此時,A[i]並不是最終要找到的數字,還需要遍歷陣列A,檢視A[i]是否出現了三次。但這個方法整體的時間複雜度為O(n^2)。

上面分析了幾個思路,希望能夠幫助大家開拓思路,這裡留給大家一個思考題目:上面這個題目,能夠在時間複雜度O(n),空間複雜度O(1)的條件下完成麼?如果不能怎麼說明?

之前的“找數字”的題目,除了我們介紹的解法,尚有比較犀利,充滿技巧的解法。那麼這個題目呢?希望大家熱烈的討論,可以在微博上和我們互動。

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

相關文章