问题描述:一个数组其中有一个元素出现了一次(奇次),其他元素都出现两次(偶数次数),找出出现一次(奇次)的元素。
分析:碰到这种偶次奇次的问题,首先要想一下位运算中的异或。一个数异或本身为0,一个数异或0不变。a ^ a = 0, a ^ 0 = a。
这个题中,我们可以把所有的数一起求异或,那剩下的肯定就是出现一次的元素了。
int FindOnly(int *a, int n)
{
int onlyNum = a[0];
for(int i = 1; i < n; i++)
{
onlyNum = onlyNum ^ a[i];
}
return onlyNum;
}
问题变种:一个数组其中有两个元素出现了一次(奇次),其他元素都出现两次(偶数次数),找出出现一次(奇次)的元素。
此篇帖子里有详细描述,我并没有找到原文,他也是转的:http://blog.youkuaiyun.com/wangwh485/article/details/6715357
分析:因为有两个元素了,他俩异或运算后的结果根本无法分辨出是哪两个数,但是他俩异或的结果却可以让我们把他俩分开。
我们根据这个结果的最后为1的位,来把原数组分成两个数组(此位为0的一组,此位为1的一组,这样两个出现一次(奇次)就被分到两个数组中了),再分别对这两个数组用第一个问题的方法。