缺失的數字;及找數字分析

紫鳳發表於2013-09-17

今日面試題:缺失的數字

給定一個無序的整數陣列,怎麼找到第一個大於0,並且不在此陣列的整數。比如[1,2,0] 返回 3, [3,4,-1,1] 返回 2。最好能O(1)空間和O(n)時間。

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

找數字分析原題陣列A中,除了某一個數字x之外,其他數字都出現了三次,而x出現了一次。請給出最快的方法,找到x。

分析

乍一看這個題目,不少同學立馬給出了答案:異或。但舉個例子,就會發現,異或是行不通的,一般的方法是利用異或的的如下特性:

A xor A = 0

A xor 0 = A

但是這個題目中,數字都是奇數個的,直接採用之前類似題目的異或方法,已經不合適了。 除此之外,我們還可能想到如下的方法:

採用hashmap,時間複雜度O(n),空間複雜度O(n)

對陣列A進行排序,然後在遍歷一次,時間複雜度O(nlogn),空間複雜度O(1)

是否還有一些效果更好的方法呢?這一類的題目,即使簡單的異或不能解決,也可以從二進位制位、位操作方面去考慮,總之這樣的大方向是不會錯的。

題目中,如果陣列中的元素都是三個三個出現的,那麼從二進位制表示的角度,每個位上的1加起來,應該可以整除3。如果有一個數x只出現一次,會是什麼情況呢?

如果某個特定位上的1加起來,可以被3整除,說明對應x的那位是0,因為如果是1,不可能被3整除

如果某個特定位上的1加起來,不可以被3整除,說明對應x的那位是1

根據上面的描述,我們可以開闢一個大小為32的陣列,第0個元素表示,A中所有元素的二進位制表示的最低位的和,依次類推。最後,再轉換為十進位制數即可。這裡要說明的是,用一個大小為32的整數陣列表示,同樣空間是O(1)的。

不過這裡申請了一個陣列的空間,如果這個是不被允許的呢?請大家開動腦筋,我們會在後續的文章中分享。

【分析完畢】

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

相關文章