2010-11-10 76 views
5

我想標題可能有點誤導,但我想不出一個更好的。 我有一個數組A [],其中的所有元素都出現了一些倍數爲15的倍數,例如2次發生30次,3次發生45次。但是一個元素會出現x次,其中x不是15的倍數。如何打印數字x。我正在尋找一個沒有散列表的線性解決方案。在O(n)時間估計一個數組元素的頻率

謝謝。

+1

啊,我只是想說哈希表! :) – leppie 2010-11-10 16:20:54

+0

@leppie如果你想擁有散列表,它將保證'O(1)'它將是'2^32'的大小,這是妄想。否則你不能保證'O(n)' – Andrey 2010-11-10 17:31:42

+0

重複http://stackoverflow.com/questions/3963409/interview-question-dealing-with-m-occurrences-among-n – Nabb 2010-11-11 15:51:49

回答

7

這裏有類似的問題,在StackOverflow上,但我找不到它。

讓我們使用3而不是15,因爲它會更容易,我認爲它是完全等效的。序列將是4, 5, 4, 5, 3, 3, 4, 5,二進制100, 101, 100, 101, 11, 11, 100, 101

你可以做到以下幾點:和所有的值在至少數顯著位和取餘數比3(15最初):

bit1 = (0 + 1 + 0 + 1 + 1 + 1 + 0 + 1) % 3 = 5 % 3 = 2 != 0

如果!= 0那麼該位等於1我們試圖找到的數字。現在讓我們移動到下一個:

bit2 = (0 + 0 + 0 + 0 + 1 + 1 + 0 + 0) % 3 = 2 % 3 = 2 != 0

bit3 = (1 + 1 + 1 + 1 + 0 + 0 + 1 + 1) % 3 = 6 % 3 = 0 == 0

因此,我們必須bit3 == 0, bit2 != 0, bit1 != 0,使得011。轉換爲十進制:3

空間複雜度爲O(1)和時間複雜度爲O(n * BIT_LENGTH_OF_VARS),其中BIT_LENGTH_OF_VARS == 8爲字節,BIT_LENGTH_OF_VARS == 32對於int等,因此,它可以很大,但常數不影響漸近性和O(n * BIT_LENGTH_OF_VARS)真的O(n)

就是這樣!

相關問題