查找出現的次數爲奇數次的自然數(位運算)

這也是在看位運算時,覺得經常會問到的一個題:
有一個數列,其中的自然數都是以偶數次的形式出現,只有一個自然數出現的次數爲奇數次。編寫程序找出這個自然數。
看到這個題感興趣是因爲之前有個很火的位圖的題,我覺得有一點點相通的,就分享一下。
第一種方法:
1、將數列從小到大排序;
2、遍歷數組a,並對出現的數進行計數b;
3、對計數數組b遍歷,查找奇數位置,即得出答案。
第二種方法:
也就是第一種的改良,少排序過程。
1、遍歷數組a,查找出最大的max;
2、動態申請max+1的數組b,並清0;
3、對數組a遍歷,b[a[i]]++;
4、遍歷b,找出奇數位置,得出答案。
第三種方法:
直接使用位運算的異或,一次遍歷,即可得出答案。

#include <stdio.h>

#define DIM(a) (sizeof(a)/sizeof(*a))

int main()
{
    int a[] = {2, 3, 5, 7, 2, 2, 2, 5, 3, 7, 1, 1, 1};
    int find = 0;
    
    for(int i=0;i<DIM(a);i++)
	{
		find = find^a[i];
    }
	printf("find=%d\n",find);
	
    return 0;
}

瞬間發現位運算真是方便啊。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章