方法一:
思路:
我们可以先创建一个新的数组,初始化为0,然后让原来的数组里面的元素作为新数组的下标
如果该下标对应的值为0,说明没有出现过该数,赋值为1作为标记,表示出现过1次
如果该下标对应的值为1,说明已经出现过该数,赋值为2作为标记,表示出现过2次
最后遍历新数组,如果值为1,说明该下标只出现一次(即原来数组的元素只有一个)
打印该下标即可
答案:
int main()
{
int arr[] = { 1,2,3,4,5,1,2,3,4,6 };
int len = sizeof(arr) / sizeof(arr[0]);
int arr1[100] = { 0 };
for (int i = 0; i < len; i++)
{
if (arr1[arr[i]] == 0) //如果该下标没有出现过
{
arr1[arr[i]] = 1; //赋值为1表示出现次数变为1
}
else if (arr1[arr[i]] == 1) //如果该下标已经出现过一次
{
arr1[arr[i]] = 2; //赋值为2表示出现次数变为2
}
}
for (int j = 0; j <= 100; j++) //寻找只出现一次的下标
{
if (arr1[j] == 1)
{
printf("%d ", j);
}
}
printf("\n");
return 0;
}
方法二:
#include<stdio.h>
void find(int arr[], int len, int* p1, int* p2)
{
int k = 1; //第k位不同
int ret = 0;
for (int i = 0; i < len; i++) //先找出不同的两个数异或的结果 例如5^6
{
ret = ret ^ arr[i];
}
while (ret & 1 != 1) //如果最后一位不为1,说明不同的两个数这一位是一样的
{
ret = ret >> 1; //找下一位
k++; //记录是第几位
}
for (int i = 0; i < len; i++)
{
int j = 0, dex = 0;
if ((arr[i] >> k) & 1) //相同的为一坨
{
p1[j] ^= arr[i]; //求出一个不同的数
}
else //不同的为一坨
{
p2[dex] ^= arr[i]; //求出另一个不同的数
}
}
}
int main()
{
int arr[] = { 1,2,3,4,5,1,2,3,4,6 };
int len = sizeof(arr) / sizeof(arr[0]);
int p1[1] = { 0 };
int p2[1] = { 0 };
find(arr, len, p1, p2);
printf("%d %d\n", p1[0], p2[0]);
return 0;
}