找出陣列中兩個只出現一次的數字

2022-08-20 17:42:07 字數 814 閱讀 2794

題目:乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。要求時間複雜度是

o(n)

,空間複雜度是

o(1)

。分析:把題目換一下,如果出現不同的數字只有乙個,這可以很容易實現,即把所有的數字異或即可得出結果;可是,現在的題目是有兩個不同的數字。全部異或的結果只能是這兩個不同數字的異或。由於兩個數字不同所以他們異或的結果不為0,即意味這兩個不同的數字有其中的某乙個位元位不同。所以可以根據這個位元為的不同將所有的資料分為兩類,則這兩個數字將分別在不同的分類中。此時分別對這兩類按照之前的方法,把他們(同一類的資料)分別異或將得到這兩個不同的數字。

#include using

namespace

std;

int xor(int a, int n) //

把陣列a的n個資料異或

return

res;

}void finddiff(int a, int n, int *x, int *y)

}*x = 1

; *y = 1

;

for (int p=0; pp)

else

//位元位為1的為一類

}*x ^= 1; //

消除初始值

*y ^= 1;}

intmain()

; //

8 9finddiff(a,

sizeof(a)/sizeof(int), &x, &y);

cout

<"

"return0;

}

找出陣列中兩個只出現一次的數字

題目 乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。要求時間複雜度是 o n 空間複雜度是 o 1 解題思路 這個題目的突破口在 題目為什麼要強調有乙個數字出現一次,其他的出現兩次?我們想到了異或運算的性質 任何乙個數字異或它自己都等於 0。也就是說,如...

找出陣列中兩個只出現一次的數字

問題描述 乙個陣列中除了兩個數字之外,其餘數字均出現了兩次 或偶數次 請寫出程式查詢出這兩個只出現一次的數字,要求時間複雜度為o n 空間複雜度為o 1 問題分析 這是一道很新穎的關於位運算的面試題。首先考慮這個問題的乙個簡單版本 乙個陣列中除了乙個數字之外,其餘的數字均出現兩次,請寫程式找出這個出...

找出陣列中兩個只出現一次的數字

問題描述 乙個陣列中除了兩個數字之外,其餘數字均出現了兩次 或偶數次 請寫出程式查詢出這兩個只出現一次的數字,要求時間複雜度為o n 空間複雜度為o 1 問題分析 這是一道很新穎的關於位運算的面試題。首先考慮這個問題的乙個簡單版本 乙個陣列中除了乙個數字之外,其餘的數字均出現兩次,請寫程式找出這個出...