问题描述:一个数组其中有一个元素出现了一次(奇次),其他元素都出现两次(偶数次数),找出出现一次(奇次)的元素。
分析:碰到这种偶次奇次的问题,首先要想一下位运算中的异或。一个数异或本身为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的一组,这样两个出现一次(奇次)就被分到两个数组中了),再分别对这两个数组用第一个问题的方法。
我这里就直接引用上面帖子中的代码了:
int getSingle(int *a, int n) //获取全部元素的异或结果
{
if(!a)
return -1;
int sum = a[0] ;
for(int i = 1; i < n; i++)
sum ^= a[i] ;
return sum ;
}
void getTwo(int *a ,int & one, int & two, int sum, int n) /

该博客介绍了如何解决数据结构面试题,即在一个数组中找出唯一出现一次的元素。通过分析偶数次和奇数次出现的特性,利用位运算中的异或操作,可以有效地找到这个元素。博主引用了他人帖子中的代码,通过将数组按某位异或结果分为两部分,然后对每部分再次进行异或操作,从而找到目标元素。
最低0.47元/天 解锁文章
16万+

被折叠的 条评论
为什么被折叠?



