56 陣列中只出現一次的數字

2021-10-03 18:09:50 字數 781 閱讀 5036

牛客網

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

兩個相等的元素異或的結果為 0,而 0 與任意數 x 異或的結果都為 x。

對本題給的陣列的所有元素執行異或操作,得到的是兩個不存在重複的元素異或的結果。例如對於陣列 [x,x,y,y,z,k],x^x^y^y^z^k = 0^y^y^z^k = y^y^z^k = 0^z^k = z^k。

兩個不相等的元素在位級表示上一定會有所不同,因此這兩個元素異或得到的結果 diff 一定不為 0。位運算 diff & -diff 能得到 diff 位級表示中最右側為 1 的位,令 diff = diff & -diff。將 diff 作為區分兩個元素的依據,一定有乙個元素對 diff 進行異或的結果為 0,另乙個結果非 0。設不相等的兩個元素分別為 z 和 k,遍歷陣列所有元素,判斷元素與 diff 的異或結果是否為 0,如果是的話將元素與 z 進行異或並賦值給 z,否則與 k 進行異或並賦值給 k。陣列中相等的元素一定會同時與 z 或者與 k 進行異或操作,而不是乙個與 z 進行異或,乙個與 k 進行異或。而且這些相等的元素異或的結果為 0,因此最後 z 和 k 只是不相等的兩個元素與 0 異或的結果,也就是不相等兩個元素本身。

下面的解法中,num1 和 num2 陣列的第乙個元素是用來保持返回值的... 實際開發中不推薦這種返回值的方式。

int diff = 0;

for (int num : nums)

diff ^= num;

diff &= -diff;

for (int num : nums) }

56 陣列中只出現一次的數字

乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。功能測試 陣列中有多對重複的數字 沒有重複的數字 邊界測試 陣列小於2 異或運算 乙個數字與其本身異或,結果為0。即 a a 0 乙個數字與0異或,結果為其本身。即a 0 a 當只有乙個數出現一次時,我們把陣...

陣列中只出現一次的數字

何海濤 劍指offer 名企面試官精講典型程式設計題 九度oj 題目描述 乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。輸入 每個測試案例包括兩行 第一行包含乙個整數n,表示陣列大小。2 n 10 6。第二行包含n個整數,表示陣列元素,元素均為int。輸...

陣列中只出現一次的數字

來自劍指offer 分析 如果整型陣列中只有乙個數字出現一次,我們只需將陣列中每個元素依次做異或操作,最終就得到了只出現一次的數字。因為自己與自己異或後,結果為0.現在,陣列中有兩個數字只出現一次,上述一次遍歷後將所有元素異或得不到那兩個數字。因此,我們試著將原陣列分成兩個子陣列,使每個子陣列中分別...