#include <stdio.h>
/*
原题描述:
一个数组中有一个数字只出现一次,其他数字都出现了偶数次。请找出一个只出现一次的数字?
解题思路:
将数组中所有的元素异或,最终的元素就是只出现一次的数字
*/
static int FindOneNum(int arr[], int length)
{
int i, num=0;
for(i=0; i<length; i++)
num ^= arr[i];
return num;
}
/*
原题描述:
一个数组中有二个数字只出现一次,其他数字都出现了偶数次。请找出二个只出现一次的数字?
解题思路:
将数组中所有的元素异或,最终的元素就是那两个只出现一次的元素的异或。
因为那两个元素不相等,所以异或的结果必然不为0。
假设结果的某个bit为1,那必然是原来的两个数的这个位,一个为1,一个为0。
利用这个特性,将原来的数组分为两组,分别求解就可以了
*/
static int FindFirstSetBit(int num)
{
int idx=31;
while(idx>=0 && ((num >> idx) & 0x1)==0x0)
idx--;
return idx;
}
static int IsSet(int num, int n)
{
if((num>>n) & 0x1)
return 1;
return 0;
}
static void FindTwoNum(int arr[], int length)
{
int i, num1=0, num2=0;
int twonum, n;
twonum = FindOneNum(arr, length);
n = FindFirstSetBit(twonum);
for(i=0; i<length; i++)
{
if(IsSet(arr[i], n))
num1 ^= arr[i];
else
num2 ^= arr[i];
}
printf("num1=%d, num2=%d\n", num1, num2);
}
int main()
{
int arr[]={1,1,2,2,3,3,5,5,6,7,7,10,8,8,9,9};
int length = sizeof(arr)/sizeof(int);
//printf("%d",FindOneNum(arr, length));
FindTwoNum(arr, length);
return 0;
}