題目描述:
乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。
思路
根據異或去重的原理,我們知道如果只有乙個只出現一次的數字的求法,但這裡是有兩個只出現一次的數字,我們便要想辦法把他分為兩個子陣列,每個子陣列中包含乙個只出現一次的數字,其他的數字都出現了兩次。劍指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 ...