一个数组中只有两个数字是出现一次,
其他所有数字都出现了两次。
找出这两个只出现一次的数字,编程实现。
方法:遍历,查找
void Search1(int *arr, int len)
{
int i = 0;
int j = 0;
int flag = 0;
printf("只出现一次的两个数字:");
for (i = 0; i < len; i++)
{
flag = 0; //为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");
}
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;
}
方法:异或
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;
}
运行结果: