擴充套件問題二:至多掃瞄一遍序列,求出丟失的兩個數字。
不管用什麼方法,可以肯定的是我們至少需要掃瞄一遍序列。
因為只能掃瞄一遍,所以先求出 a xor b,再根據結果分類的方法就不適用了。
既然我們不能根據某一位分類,那我們能否對所有位進行分類呢?比如,int是32位,我們可以對每一位都分成兩類分別異或。
我們還要記錄每一位上1出現的次數,實際上,只需要記錄1出現奇數次還是偶數次就夠了。
如果某一位上1出現奇數次,那麼我們就知道 a 和 b 在此位上的位元不同。從而利用前面分類異或的結果就直接得出答案。
python **:
def find_missing_2_numbers_v2(sequence, n):
"""returns the missing two numbers of sequence, which is supposed
to be a permutation of with two numbers missing.
an one-pass algorithm.
"""xors = [[0 for i in xrange(2)] for j in xrange(32)]
counts = [0 for i in xrange(32)]
for i in xrange(1, n + 1):
for k in xrange(32):
t = 1 & (i >> k)
xors[k][t] ^= i
counts[k] ^= t
for e in sequence:
for k in xrange(32):
t = 1 & (e >> k)
xors[k][t] ^= e
counts[k] ^= t
a, b = 0, 0
for k in xrange(32):
if counts[k]:
a, b = xors[k][0], xors[k][1]
break
return a, b
擴充套件問題三:如果有三個數字丟失了呢?
其實上面的方法稍加修改就可以解決此問,具體實現留給讀者。有道類似
題目可以用來測試你的演算法~
LeetCode 尋找丟失的數字
給定乙個包含 0,n 中n個數的陣列nums,找出 0,n 這個範圍內沒有出現在陣列中 的那個數字.示例 1 input nums 3,0,1 output 2 示例 2 input nums 0,1 output 2 因為有2個數字,所有數字都在 0,2 之間內.示例 3 input nums 9...
面試題之尋找丟失的數字
據傳說是ms google等等it名企業的面試題 有一組數字,從1到n,中減少了乙個數,順序也被打亂,放在乙個n 1的陣列裡 請找出丟失的數字,最好能有程式,最好演算法比較快 btw1 有很多種方法的哦,據說o n 的方法就不止一種 btw2 擴充套件問題,如果丟失了2個數字呢?btw3 一定要小心...
MS Google面試題 尋找丟失的數字
題目 有一組數字,從1到n,其中丟失了乙個數字,且順序也被打亂的儲存在乙個 size 為n 1的陣列中 要求 找出丟失的數字,最好能有程式,最好演算法比較快 btw1 有很多種方法哦,據說o n 的方法不止一種 btw2 擴充套件問題,如果丟失兩個,並找出這兩個數字 或者,丟失三個,找出三個中的任意...