40億個非負整數中找到出現2次的數和所有數的中位數

2021-08-29 04:06:29 字數 1041 閱讀 2406

題目一:32位無符號整數的範圍是0~4294967295,現在有40億個無符號整數,可以使用最多1gb的記憶體,找出所有出現了兩次的數。

題目二:記憶體限制在10mb,如何找到這40億個整數的中位數。

解法思路:

依然bit 陣列的思路,不過這次是雙倍長度了,因為我們除了要記錄這個數字,同時還有記錄他出現的次數。但是這個次數要注意一下,看下文:

1、先建立new 乙個bit  arr=new bit[4294967295*2],長度是數字數量的兩倍大小的。

2、遍歷這40億個整數,比如讀到k這個值,那麼就讓arr[k*2]和arr[k*2+1],用*2表示所處陣列位置,*2+1表示出現的次數。當第一次遍歷到這兩個索引位置k*2和k*2+1的值分別是11,也就是arr[k*2]=1,arr[k*2+1]=1,當下次再遇到這個k值,就更新他們為1,0.

這裡有個巧妙的地方就是,當索引位置k*2和k*2+1的值分別是1和0,我們就表示他出現了2次。第三次,第四次過來更新的時候需要先判斷是否值分別是1,0,如果是就不用做更新了。如果是0和0,那就更新為1和1。如果是1和1就更新為1和0.

經過1,2的處理,我們這個bit 陣列長度為 4294967295*2 就很好的表示了所有出現的數,以及他出現的次數是否未出現,或者只出現一次,或者是出現了2次。出現更多次就沒法表示了。這樣就成功解答了。

題目二的解題思路:

其實也是要先分割槽,10m大小,40億個數,約等於16gb,16gb/10mb=16*1024/10,約等於1600多,所以我們需要分割槽數量大於1600,取個整,我們就是去2048。所以分成2048堆數。

步驟1:新建乙個int[2048] arr陣列。arr[0]表示分割槽0,統計到的數出現的個數。

步驟2:開始遍歷這40億個數。更新arr指定分割槽的統計值。

步驟3:得到arr陣列後,我們就遍歷arr,累加arr[i]+arr[i+1],如果第一次發現統計值大於20億,那最新那個arr[k],這個k分割槽就有存在我們要的中位數。比如arr[0]+arr[1]+.....arr[66666]=19億999999,那麼arr[66667],這個分割槽的第乙個數,剛好就是我們的中位數。

40億個非負整數中找到沒出現的數

要求這裡的非負整數是32位也就是0 2 32 1。最多用1gb的記憶體。如果只能用10mb的空間呢,只需要找到乙個沒有出現的數即可。首先先分析一下,40億個4b約為16gb這裡只用1gb,這裡要求注意是找出沒出現,這就和網頁過濾系統類似,出現與不出現兩個狀態 0和1 那麼我們就可以用bit陣列來確定...

40億個非負整數中找到未出現的數

32位無符號整數的範圍是0 4 294 967 295,現在有乙個正好包含40億個無符號整數的檔案,所以在整個範圍中必然有未出現過的數。怎麼找到所有未出現過的數?要求 可以使用最多1gb的記憶體。高階 記憶體限制10mb,但是只用找到乙個沒出現過的數即可。常規方法 假設用雜湊表來儲存出現過的數,那麼...

40億個非負整數中找到出現兩次的數和中位數

問題 現有40億個32位的無符號整數 0 4294967295 可以最多使用1gb,找出出現兩次的數 補充問題 最多用10mb,找到中位數 思路 問題一 可以申請乙個長度為 4294967295 2 的bitmap,用兩個位置表示乙個詞頻,首次遇到數num,則bitarr num2 1 和bitar...