找出陣列中出現奇數次的元素 1個或2個

2021-09-11 22:13:44 字數 1026 閱讀 2704

1.題目:給定乙個含有n個元素的整型陣列arr,其中只有乙個元素出現奇數次,其餘的都出現偶數次,找出這個元素。

思路:我們基本上都知道計算機的位運算,其中有乙個異或運算:對於任意乙個數k,k^k=0,k^0=k,所以我們只需要將arr中所有的元素進行異或,那麼個數為偶數的元素異或後都變成了0,只留下那個個數為奇數的那個元素。

#include void find(int arr, int len) 

int main() ;

find(arr, len);

return 0;

}

2.題目:給定乙個含有n個元素的整型陣列arr,其中有兩個元素出現奇數次,其餘的都出現偶數次,找出這兩個元素。

思路:我們假設這兩個數分別為a、b,並將陣列元中所有元素異或之後的結果為s。因為a!=b,所以s=a^b且s!=0,判斷s的二進位制中為1的位數。我們只需要知道s某一為1的位數k(如00101010,其中1對應的位數分別為1、3、5,所以k可以取1、3或5),然後將s與陣列中第k位為1的元素進行異或,異或結果就是a或b其中的乙個,然後用s與其異或,即可得出另外乙個。因為s中的第k位為1,表示a或b中其中乙個的第k位也為1,假設為a,將s與陣列中第k位為1的元素進行異或時,即將s與a以及其它第k位為1的出現過偶數次的數進行異或,化簡即為s與a異或,最終結果即為b。

#include void find(int arr, int len) 

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

if ((arr[i] >> k) & 1)

s ^= arr[i];

printf("%d %d\n", s, s ^ s2);

}int main() ;

find(arr, len);

return 0;

}

找出出現奇數次的數

題目 給你n個數,其中有且僅有乙個數出現了奇數次,其餘的數都出現了偶數次。用線性時間常數空間找出出現了奇數次的那乙個數。給你n個數,其中有且僅有兩個數出現了奇數次,其餘的數都出現了偶數次。用線性時間常數空間找出出現了奇數次的那兩個數。答案 從頭到尾異或一遍,最後得到的那個數就是出現了奇數次的數。這是...

異或運算 尋找陣列中出現奇數次的1個或兩個值

給定乙個整數陣列local,已知陣列中只有乙個數出現了奇數次,其他數都出現了偶數次,找出這個出現奇數次的數。此題用到異或的性質 n n 0 n 0 n 並且異或操作滿 換律和結合律。令e 0,讓e逐個對陣列中的值做異或,最後結果值即為該出現奇數次的值.如local 令e a b c a b n c ...

輸出陣列內只出現奇數次的元素

給定乙個陣列,該陣列內只有乙個數隻出現了奇數次,請找出這個數字 異或 由異或關係可知,x x 0,x 0 x 並且異或滿 換律,因此這個特殊陣列內所有的偶數次元素與自己異或都會為0,最後出現次數為奇數次的元素和0異或當然是本身了,這樣便輸出這個元素了。如下 public class test int...