劍指offer 陣列中只出現一次的數字

2021-08-20 03:22:57 字數 1875 閱讀 5749

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

/**

*@author calvin 2023年5月20日上午10:31:08

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

*///num1,num2分別為長度為1的陣列。傳出引數

//將num1[0],num2[0]設定為返回結果

/** * 首先:位運算中異或的性質:兩個相同數字異或=0,乙個數和0異或還是它本身。

* 當只有乙個數出現一次時,我們把陣列中所有的數,

* 依次異或運算,最後剩下的就是落單的數,因為成對兒出現的都抵消了

* 。 依照這個思路,我們來看兩個數(我們假設是ab)出現一次的陣列。

* 我們首先還是先異或,剩下的數字肯定是a、b異或的結果,這個結果的二進位制中的1,

* 表現的是a和b的不同的位。我們就取第乙個1所在的位數,

* 假設是第3位,接著把原陣列分成兩組,分組標準是第3位是否為1。

* 如此,相同的數肯定在乙個組,因為相同數字所有位都相同,而不同的數

* 肯定不在一組。然後把這兩個組按照最開始的思路,依次異或,

* 剩餘的兩個結果就是這兩個只出現一次的數字。

* *

* 異或滿足交換律和結合律

* * */

public

class

solution else

//得到第乙個出現的1,因為相同為0,不同為1

//所以這就是2個數字的乙個不同的地方,用這個來區分2個數字

int index = findfirst1(res);

for(int i = 0 ; i < length; ++i)else}}

} private

boolean

isbit1(int target, int index)

private

intfindfirst1(int bitresult)

return index;

} /**

以下為牛客id 高琥所寫

*//** * 陣列中有兩個出現一次的數字,其他數字都出現兩次,找出這兩個數字

*@param array

*@param num1

*@param num2

*/public

static

void

if(array == null || array.length <= 1)

int len = array.length, index = 0, sum = 0;

for(int i = 0; i < len; i++)

for(index = 0; index < 32; index++)

for(int i = 0; i < len; i++)else

}}/**

* 陣列a中只有乙個數出現一次,其他數都出現了2次,找出這個數字

*@param a

*@return

*/public

static

intfind1from2(int a)

return res;

}/**

* 陣列a中只有乙個數出現一次,其他數字都出現了3次,找出這個數字

*@param a

*@return

*/public

static

intfind1from3(int a)

}int res = 0;

for(int i = 0; i < 32; i++)

}return res;

}}

劍指offer 陣列中只出現一次的數字

1 乙個數字出現一次,其他數字出現兩次 兩個相同的數異或為0,所以將陣列裡的所有數依次異或,得到的結果就是只出現一次的數。include using namespace std int main int num 0 for int i 0 i 7 i cout 2 乙個數字出現一次,其他數字出現n次...

劍指offer 陣列中只出現一次的數字

乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。解法 首先考慮如果陣列中只有乙個數字出現一次,其他的數字都出現兩次,怎麼找出這個只出現一次的數字?這裡需要用到異或運算的性質 乙個數字 不管是什麼形式的數字,只要其二進位制形式確定 和其自身的異或運算的結果一...

《劍指offer》 陣列中只出現一次的數字

乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。解法 1.了解幾個常識 a.了解兩個相同的數字異或結果為0 b.任何數字與0進行異或結果為數字本身 c.任何數字與1相與,只有最低位 右邊 為1時候,才等於1 2.一種對陣列分成兩組的方法,比如2 10 和3...