尋找丟失的數字(二)

2022-05-09 08:09:09 字數 1108 閱讀 6879

擴充套件問題二:至多掃瞄一遍序列,求出丟失的兩個數字。  

不管用什麼方法,可以肯定的是我們至少需要掃瞄一遍序列。

因為只能掃瞄一遍,所以先求出 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 擴充套件問題,如果丟失兩個,並找出這兩個數字 或者,丟失三個,找出三個中的任意...