目录
1.问题
问题:给定一个非空整型数组,除了某个元素出现一次外,其余每个元素均出现两次,找出只出现了一次的元素
例如:int a[] = {1,2,3,4,5,1,2,3,4};
a的整型数组中,只有5是出现了一次,其余的数字都是成双出现的。目标,找出5
2.循环实现
实现思路:通过循环,将数组的每个元素遍历,然后判断元素是否只是出现了一次
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a[] = { 1,2,3,4,5,1,2,3,4 };
int i = 0;
int sz = sizeof(a) / sizeof(a[0]); //数组大小
for (i = 0; i < sz; i++) //循环数组每个元素
{
int count = 0; //计数变量
int j = 0;
for (j = 0; j < sz; j++) //循环数组每个元素
{
if (a[i] == a[j]) //当元素相同的时候,count++
count++; //因为两次都是从a[0]遍历,所以count最少为1
}
if (count == 1) //当数组某个元素单独出现,打印出来
printf("%d\n", a[i]);
}
return 0;
}
在判断出的时候,应该break跳出循环,本代码没有跳出
这是一种暴力求解思路,如果数组元素够多的话,代码还需要优化
3.异或实现
之前交换两个数字的实现中,可以知道异或的两个特性
- 0^a=a
- a^a=0
如果将数组的每一个元素都异或的话,相同的元素会异或成0,而单独的数字会和0异或成自身,那么就可以找到这个单独的数字
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a[] = { 1,2,3,4,5,1,2,3,4 };
int i = 0;
int sz = sizeof(a) / sizeof(a[0]); //数组大小
int ret = 0;
for (i = 0; i < sz; i++) //循环数组每个元素
{
ret ^= a[i]; //异或每一个元素
}
printf("%d\n", ret);
return 0;
}