一次遍歷找出不同的數 位運算

2021-08-17 20:15:24 字數 1300 閱讀 6797

題目:輸入一組偶數個的數,其中只有一對數是不同的,其他的都是成對出現。

數字的範圍:0~int_max

數字的個數:2~2000000個

如輸入1 2 3 2 2 3

輸出1 2

使用陣列記錄出現次數,並且判斷是否出現偶數次,效率較低。

使用異或規則:

a⊕b=b⊕a  交換律

a⊕0=a    與0異或不變

a⊕b⊕b=a  偶數次異或為結果0

a⊕(b⊕c)=(a⊕b)⊕c    結合律

如果只有乙個數字單獨出現運用③:

#include #include int main()

; int ret = 0;

int len = sizeof(arr) / sizeof(arr[0]);

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

printf("出現奇數次的數為:> %d\n", ret);

system("pause");

return 0;

}

如果是有兩個數均出現了一次,那麼異或的結果為這兩個數的異或,所以現在就是從這個結果中去算出各自的值。根據異或的性質,如果該位為0,表示兩位數在該位二進位制相同;若該位為1,表示二進位制位不同。

現在我們看如何將一組數分為每一組數都只有乙個數出現過一次的兩組數:首先我們對所有數進行異或,那麼得到的就是兩個出現奇次的那兩個數的異或,比如,就得到7⊕4,這個數肯定不為0,我們找出這個數的二進位制數的最右邊的1(設最右邊的1在第inter位),然後找出陣列的每個元素的第inter位,並判斷此位是1還是0,是1的為一組,是0的為一組,這樣就分好了組,再利用上面的例子,就可得到出現奇數次的那兩個數。

#include #include int main()

; int len = sizeof(arr) / sizeof(arr[0]);

int ret = 0;

int inter = 0;

int reta = 0;

int retb = 0;

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

/*找ret最右邊的1*/

inter = ret - (ret&(ret - 1));

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

else

}printf("出現奇數次的兩個數為:> %d,%d\n", reta, retb);

system("pause");

return 0;

}

力扣日記 136 只出現一次的數 位運算

給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。說明 你的演算法應該具有線性時間複雜度。你可以不使用額外空間來實現嗎?任何數於0異或為任何數 0 n n 相同的數異或為0 n n 0 var a 2,3,2,4,4 2 3 2 4 4等價於 2 ...

找陣列中只出現一次的兩個數 位運算

這是昨天人人院招的一道筆試演算法題 題目大概意思是,有乙個無序的從1 n的陣列,每個數都是存了兩遍,但是丟失了兩個數,把這丟失的兩個數找到,例如給定的n 3,a 1,2,1,3 丟失的兩個數為2,3。其實就是找陣列中只出現一次的兩個數。對於這種偶數字中尋找奇一般是通過異或的方法,因為異或滿足結合律和...

尋找出現一次的數

分析 如果這裡的陣列a的規模比較小,在記憶體的可以容納的範圍之內,可以建立hash表,順序掃瞄a中的每乙個 數,統計每個數的出現次數,最後找出僅出現一次的數即可,時間複雜度為o n 空間複雜度為o n 如果陣列a的規模很大呢?難道是進行外排序,然後 通過merge的方式找到嗎?有沒有更好的額方式?如...