尋找缺失的數

2021-06-26 20:06:23 字數 2085 閱讀 9131

有一組數字,從1到n,中減少了乙個數,順序也被打亂,放在乙個n-1的陣列裡

請找出丟失的數字,最好能有程式,最好演算法比較快

btw1: 有很多種方法的哦,據說o(n)的方法就不止一種

btw2: 擴充套件問題,如果丟失了2個數字呢?

btw3: 一定要小心不要溢位,嗯,面試者有時候不會提醒你的

btw4: 最好不要多申請n多空間

update 乙個很相近的題目:1-1000放在含有1001個元素的陣列中,只有唯一的乙個元素值重複,其它均只出現一次。每個陣列元素只能訪問一次,設計乙個演算法,將它找出來;不用輔助儲存空間,能否設計乙個演算法實現?

題目 :

給你n個數,其中有且僅有乙個數出現了奇數次,其餘的數都出現了偶數次。用線性時間常數空間找出出現了奇數次的那乙個數。

給你n個數,其中有且僅有兩個數出現了奇數次,其餘的數都出現了偶數次。用線性時間常數空間找出出現了奇數次的那兩個數。

第一題: 看到題目的第一反應就是把這個n-1個數字加起來,然後和1+2+3..+n的和進行比較,那個差值就是迷失的數字。但是這個方法正是btw3裡面提到的不要溢位:)所以有一定的風險,還是不採用,還有人說用乙個個+-來判斷,可以是可以但是**寫起來也比較難看(個人感覺),還是異或操作符來的最合適一些。 我們知道1^1=0;2^2=0;n^n=0;k^0=k;所以如果我們把這n-1個數字異或起來,再來異或一下1,2,..n。那麼最終的答案肯定是迷失數字k^(1^1)^(2^2)...^(n^n)。也就是k了。我們很容易地寫下來了函式:

思路1:

求出1-n的總和,減去陣列中n-1個數,則剩下的值就是丟失的數字。這種方法求和的時候,有可能溢位。可以採用1-a[0]+2-a[1]+3-a[2]+....n-1-a[n-2]+n;

/**功能:1-n的和,與陣列和的相差就是所缺少的數.這種方式只適合於數比較小,不然和會溢位.

*也有不溢位的方式:1-a[0]+2-a[1]+3-a[2]+....n-1-a[n-2]+n;

*/int find_missing_num_add(int *arr,int n)

{ int ret=n*(n+1)/2;

for(int i=0;i思路2:

採用異或。異或的性質:0^1=1,1^1=0,0^0=0。所以可以採用1^2^3....^n^a[0]^a[1]....^a[n-1]。因為相同的數異或結果為0,而0與n異或的結果為n。

// in case find one missing number, here size is 1 less than the range n

int find_missing_number1 (int a, int size)

{ int number=0;

for (int i=0;i

思想:也是採用異或。

假設,缺失的數為s1和s2。則s1^s2=1^2^3.....^n^a[0]^a[1]^....a[n-3]。這個式子一目了然,無需多解釋。問題是如何通過這個式子求出s1與s2的值。只要能求出乙個值,比如說s1,則s2=s1^(s1^s2)。

s1^s2的值必然不為0,則必然存在一位,s1與s2在此對應位不同。我們就可以按照此對應位是0或者1,將1-n分為兩堆,將a[0]-a[n-3]分為兩堆。將該為為1的兩堆數相異或就能求出缺失的乙個數。

舉個例子。1-7中缺失3,4。轉化為二進位制位:011和100。三位都不同,我們用最後一位來判別,將1-n和陣列非為兩堆。

則結果為:

標誌位(最後一位)10

1-n1、3、5、7

2、4、6

a[0]-a[n-3]

1、5、7

2、6

用標誌位為1的數進行異或

1^3^5^7^1^5^7=3。這樣就求出了乙個缺失數。

類似地,我們寫下了如下的**:

// in case find two missing numbers, here size is 2 less than the range n

void find_missing_number2 (int a, int size, int& miss1, int& miss2)

{ miss1 = 0;

miss2 = 0;

int number=0;

for (int i=0;i

尋找隨機產生的缺失數

今天給大家說一下之前面試的時候遇到的一道面試題,當時還是想了很久的,其實超簡單,可能是面試因為緊張的原因,當時看到這道題時大腦一片空白,失去了邏輯推理能力,想了有10分鐘才恍然大悟。題目 給定一組連續的整數,例如 1,2,3,100,但其中缺失乙個數字 利用random函式隨機生成 試找出缺失的數字...

尋找缺失的那個數

題目 給定乙個大小為n的陣列a 0.n 1 陣列中包含0.n中的n個數,其中有乙個數丟失,沒有在陣列中。現在假設陣列中的資料只有乙個fetch i 操作,用於獲取樹脂第i為的bit位。要求給定乙個o n 的演算法,找出缺失的那個數。分析 對於這個題目,由於我們一次只能獲取數值的乙個位資訊。所以我們無...

尋找缺失的資料002

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