方法一:遍历,查找
定义一个标志flag,利用for循环嵌套遍历数组,若arr[i]=arr[j],i!=j,说明这个数字出现了两次,flag=1.
void Search1(int *arr, int len)
{
int i;
int j;
int flag = 0;
printf("只出现一次的两个数字:");
for (i = 0; i < len; i++)
{
flag = 0;//为零表示数字只出现了一次
for (j = 0; j < len;j++)
{
if (arr[j] == arr[i] && i != j)
{
flag = 1;
}
}
if (0 == flag)
{
printf("%d ", arr[i]);
}
}
printf("\n");
}
方法二:异或法
异或 ^ 零异或任何数字为数字本身,相同数字异或为0
// a b 为只出现一次的数字
第一步:将数组中所有数字异或一遍,最终num=a^b
第二步:寻找第一位出现1的地方,赋给pos
第三步:找出两个出现一次的数字
void Search(int *arr, int len,int *px,int *py)
{
int i = 0;
int x = 0;
int pos = 0;
int num = 0;
for (i = 0; i < len; i++)
{
num = num^arr[i];
}
for (i = 0; i < 32; i++)
{
if (((num>>i)&1)==1)//7^6 111
{ // 110
pos = i;
break;
}
}
for (i = 0; i < len; i++)
{
if (((arr[i]>>pos)&1)==1)
{
*px = *px^arr[i];
}
else
{
*py = *py^arr[i];
}
}
printf("%d %d\n", *px,*py);
}
测试
int main()
{
int arr[] = { 1, 3, 5, 7, 3, 5, 1, 6 };
int len = sizeof(arr) / sizeof(arr[0]);
int n1 = 0;
int n2 = 0;
Search(arr, len,&n1,&n2);
Search1(arr, len);
system("pause");
return 0;
}
结果