《劍指Offer》面試題 陣列中只出現一次的數字

2021-07-05 19:36:13 字數 1963 閱讀 6721

題目描述:

乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。

思路

根據異或去重的原理,我們知道如果只有乙個只出現一次的數字的求法,但這裡是有兩個只出現一次的數字,我們便要想辦法把他分為兩個子陣列,每個子陣列中包含乙個只出現一次的數字,其他的數字都出現了兩次。劍指offer上的思路很巧妙,依然從頭到尾異或所有的數字,這樣得到的結果實際上就是兩個只出現了一次的數字異或的結果,我們在異或後的結果中找出其二進位制中最右邊為1的位,該位既然為1,說明異或的兩個數字對應的該位肯定不同,必定乙個為1,乙個為0,因此我們可以考慮根據此位是否為1來劃分這兩個子陣列,這樣兩個只出現一次的數字就分開了,但我們還要保證出現兩次的數字都分到同乙個子陣列中,肯定不能兩個重複的數字分在兩個不同的子陣列中,這樣得到的結果是不對的,很明顯,相同的數字相同的位上的值是相同的,要麼都為1,要麼都為0,因此我們同樣可以通過判斷該位是否為1來將這些出現兩次的數字劃分到同乙個子陣列中,該位如果為1,就分到乙個子陣列中,如果為0,就分到另乙個子陣列中。這樣就能保證每個子陣列中只有乙個出現一次的數字,其他的數字都出現兩次,分別全部異或即可得到這兩個只出現一次的數字。時間複雜度為o(n)。

/*

輸入:每個測試案例包括兩行:

第一行包含乙個整數n,表示陣列大小。2

<=n <= 10^6。

第二行包含n個整數,表示陣列元素,元素均為int。

輸出:對應每個測試案例,輸出陣列中只出現一次的兩個數。輸出的數字從小到大的順序。

樣例輸入:82

4363

255樣例輸出:46

*//*

思路一:用兩層for迴圈來解決。比較簡單,這裡就不進行編碼了。

思路二:利用異或去重的思想來完成。 時間複雜度為o(n)

*/#include

#include

//對陣列中全部的數求異或,並返回其結果

int xorarr(int

*arr,int len)

}/*

函式的功能:保留a的最低位的1,其他各位都為0

*/int findfirstbit1index(int a)

/* 判斷a中特定的位是否為1,若特定的位為 1,則返回true;

這裡的要判斷的特定的位由b確定,

b中只有一位為1,其他位均為0,由findfirstbit1函式返回,

而a中要判斷的位便是b中這唯一的1所在的位是否為1

*/ bool isbit1(int a,int b)

void findtwonuminarrayonlyonce(int

*arr,int len,int

*first,int

*second)

*first=0;

*second=0;

//第一步:將arr中所有的數異或。

int xorresult=xorarr(arr,len);

//第二步:找到異或結果中最右邊為1的下標。

intindex=findfirstbit1index(xorresult);

//第三步:根據index將arr分成兩個子陣列,每個子陣列中只有乙個數字的次數為1,其餘都為兩次

for(int i=0;iif(isbit1(arr[i],index))

else

} }int main(void)

//for(int i=0;iint val;

scanf("%d",&val);

arr[i]=val;

}int first;

int second;

findtwonuminarrayonlyonce(arr,n,&first,&second);

if(firstprintf("%d

%d\n",first,second);

} else

}return

0;}

《劍指offer》陣列相關面試題

在乙個長度為n的陣列裡所有數字都在0 n 1範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複,也不知道重複了幾次,請找出陣列中任意乙個重複的數字。例如,長度為7的陣列,那麼對應的輸出應該是重複的數字2或者3.思路 重排這個陣列,從頭到尾依次掃瞄這個陣列中的每個數字。掃到下標為i的數字m時 首先...

劍指offer 面試題40 陣列中只出現一次的數字

題目 乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。要求時間複雜度是o n 空間複雜度是o 1 思路 採取異或的辦法,兩個相同的數異或必然等於0。由於0與任何數異或可以得到本身,我們可以用0異或陣列的每乙個元素。因為存在兩個不同的數,所以異或的結果不等於...

劍指offer面試題7

面試題7 用兩個棧實現佇列 using namespace std template class cqueue 預備知識 佇列 佇列也是一種常見的資料結構 特點是先進先出 fifo 在stl中有stack和queue兩個容器 template class stack 成員函式 empty size ...