尋找缺失的那個數

2021-06-18 10:52:37 字數 1320 閱讀 2791

題目:

給定乙個大小為n的陣列a[0..n-1],陣列中包含0..n中的n個數,其中有乙個數丟失,沒有在陣列中。現在假設陣列中的資料只有乙個fetch(i)操作,用於獲取樹脂第i為的bit位。要求給定乙個o(n)的演算法,找出缺失的那個數。

分析:

對於這個題目,由於我們一次只能獲取數值的乙個位資訊。所以我們無法利用常規的方法,比如將0+1+2+..+n的和值減去陣列a中所有的元素的和,或是利用0^1^2^..^n^a[0]^a[1]^..^a[n-1]這種用異或的位操作來求解。現在我們對數值的位進行仔細的分析,假設此處的n為5,我們觀察從0到5的最低為的bit值為:010101,此時若我們缺少的數值的最低位為0,則可以看到陣列中最低位0的個數count(0) < count(1);若缺失的數值的最低位為1,則count(1)事實上,當n為奇數時並且缺失的數值的最低位為0,則count(0)過程如下:

統計最低有效位(假設為第i位)的0和1的個數,根據它們的值確定缺失的數值的第i位為0還是1,若為0,則排除陣列中所有最低有效位為1的數值,否則排除最低有效位為0的所有數值,並統計剩下的數值中第i+1位的資訊,確定缺失數值的第i+1位的取值。按這個過程依次求出缺失的數值的每一位的的取值。

**:

int findmissing(int *a, size_t n)

int _findmissing(int *a, size_t size, int max_column, int column)

//for

int res;

if(count_0 <= count_1) res (_findmissing(even, count_0, max_column, column+1)<<1)|0;

else res (_findmissing(odd, count_1, max_column, column+1)<<1)|1;

delete even;

delete odd;

return res;

}

複雜度:

最後,來看看這個演算法的時間複雜度。首先,在第一次迭代時,需要統計的數值個數為n;在第二次迭代時,由於排除了一半的數值,所以需要統計的數值個數為n/2;一次類推,在第i次迭代時,需要統計的數值個數為n/2^i個。因此總的時間複雜度為o(n) + o(n/2) + o(n/4) + .. + o(1) = o(2n) = o(n)。再來看演算法的空間複雜度,這個演算法的過程跟歸併排序的過程一樣,因此空間複雜度也為o(n).

尋找缺失的數

有一組數字,從1到n,中減少了乙個數,順序也被打亂,放在乙個n 1的陣列裡 請找出丟失的數字,最好能有程式,最好演算法比較快 btw1 有很多種方法的哦,據說o n 的方法就不止一種 btw2 擴充套件問題,如果丟失了2個數字呢?btw3 一定要小心不要溢位,嗯,面試者有時候不會提醒你的 btw4 ...

尋找無序陣列中個數超過一半的那個數

描述 陣列中有乙個數字出現的次數超過了陣列長度的一半,找出這個數字。輸入 第一行 陣列長度 第二行 陣列元素 輸出整數 例項輸入 5 1 2 3 4 4 4 4 例項輸出 解題思路 解法一 排序,輸出陣列一半的值 public static void main string args arrays....

尋找缺失的資料002

2 思路 3 notes 4 複雜度 5 code 面53 2已知乙個有序陣列,缺失其中的乙個元素,只缺失了乙個,讓求出缺失的是誰,並輸出,陣列從0,開始 輸入 0,1,3 輸出 2 輸入 0,1,2,3,4,5,6,7,9 輸出 8 直接遍歷一遍陣列,和下標不同的輸出出來,注意如果是最後乙個缺失的...