一组数据中只有一个数字出现了一次,其他所有数字都是成对出现的。(使用位运算)
例如:
数据:1 3 5 7 1 3 5 8这组数据中,只有7出现了一次。
代码如下:
#include<stdio.h>
int one_time(int x[],int n)
{
int i = 0;
int j = 0;
for(i=0; i<n-1; i++)
{
for(j=i+1; j<n; j++)
{
if((x[i]^x[j])==0)
break;
}
}
if((x[i]^x[j])!=0)
return x[i];
}
int main()
{
int a[9] = {1,1,2,2,3,3,4,4,5};
int tmp = 0;
tmp=one_time(a,9);
printf("%d\n",tmp);
return 0;
}<strong>
</strong>
这种方法只能找出一个不同的数字,所以要找出两个不同只能另想方法了。
#include <stdio.h>
void find(int arr[], int sz, int *num1, int *num2)
{
int i = 0;
int ret = 0;
int pos = 0;
for(i=0; i<sz; i++)
{
ret ^= arr[i];
}
for(i=0; i<32; i++)
{
if(((ret>>i)&1) == 1)
{
pos = i;
break;
}
}
for(i=0; i<sz; i++)
{
if(((arr[i]>>pos)&1) == 1)
{
*num1 ^= arr[i];
}
}
*num2 = ret ^ *num1;
}
int main()
{
int i = 0;
int arr[] = {1,2,3,4,1,2,3,4,5,6};
int x = 0;
int y = 0;
find(arr, 10, &x, &y);
printf("%d\n", x);
printf("%d\n", y);
return 0;
}