🍀题目描述:有一组数字,只有两个数字出现过一次,其余数字都出现过两次,请找出只出现过一次的数字
🍀举例:数组[1,2,3,4,6,1,2,3,4,8]
输出:6,8
🍀思路:这种题目是一种特定类型
🍖形式1:一组数字,只有一个数字出现过一次,其余数字都出现过两次,找出只出现过一次的数字。
解题思路这题我们的思路是通过将所有数字异或,最后异或的结果便是只出现过一次的数字

🍖形式2:一组数字,只有两个数字出现过一次,其余数字都出现过两次,请找出只出现过一次的数。 (也就是本题)
(1)可以采用遍历的方式,用变量n记录每个元素出现的次数,找出只出现过一次的元素。这种方式可行,但效率较低,时间复杂度为O(N^2)。
(2)我们可以类似形式1的思路,通过将数组中所有元素异或,找到两个只出现过一次数字二进制相异的位置,然后将数组分为两个不同小组,再利用形式1的思路找到两个只出现过一次的元素。

🍀代码实现:
void find_single_dog(int arr[], int sz, int singledog[])
{
int ret = 0;
int i = 0;
for (i = 0; i < sz; i++)
{
ret ^= arr[i];
}
int pos = 0;
for (i = 0; i < 32; i++)//整形不会超过32位
{
if (((ret >> i)%10) == 1)
{
pos = i;//找到二进制相异的位置
break;//结束循环
}
}
for (i = 0; i < sz; i++)
{
if ((arr[i] >> pos) % 10 == 1)
{
singledog[0] ^= arr[i];
}
else if ((arr[i] >> pos) % 10 == 0)
{
singledog[1] ^= arr[i];
}
}
}
int main()
{
int arr[] = { 1,2,3,4,9,1,2,3,4,7 };
int sz = sizeof(arr)/sizeof(arr[0]);
int singledog[2] = { 0 };
find_single_dog(arr, sz, singledog);
printf("只出现一次的数字为:%d,%d", singledog[0], singledog[1]);
return 0;
}