方法一:
思路:
我们可以先创建一个新的数组,初始化为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;
}