给定一个非空整型数组,除了某个元素只出现一次以外,其余每个元素均出现两次,找出那个只出现了一次的元素。
样例: int a[]={1,2,3,4,5,1,2,3,4},该数组中只有5出现一次,其他数字都是成对出现的,要找出5。
思路一:统记每个元素在数组中出现的次数,最后次数为1的那个元素就是要找的数。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int arr[]={1,2,3,4,5,1,2,3,4};
//找出只出现一次的元素
int sz = 0;
int i = 0;
sz = sizeof(arr)/sizeof(arr[0]);
for(i = 0; i < sz; i++ )
{
//统计arr[i]在数组中出现的次数
int j;
int count = 0;//计数
for(j = 0;j < sz; j++)
{
if(arr[j]==arr[i])
{
count=count+1;
}
}
if(count == 1)
{
printf("只出现一次的数是%d\n",arr[i]);
break;
}
}
system("pause");
return 0;
}
思路二:引入异或运算,通过异或运算满足交换律,可实现此要求
数a | 数b | 数c | 结果 | |
---|---|---|---|---|
0^5 | 000 | 101 | 101 | |
5^5 | 101 | 101 | 000 | |
5^1 ^5 | 101 | 001 | 101 | 001 |
5^5 ^1 | 101 | 101 | 001 | 001 |
代码如下
#include <stdio.h>
#include <stdlib.h>
int main()
{
int arr[]={1,2,3,4,5,1,2,3,4};
//找出只出现一次的元素
int sz = 0;
int i = 0;
int ret = 0;
sz = sizeof(arr)/sizeof(arr[0]);
for(i = 0; i < sz; i++ )
{
ret = ret^arr[i];
}
printf("只出现一次的数是:%d\n",ret);
system("pause");
return 0;
}