如何找出数组中出现奇数次的元素
只有一个数出现奇数次
给定一个含有n个元素的整型数组array,其中只有一个元素出现奇数次,找出这个元素
将array中所有元素进行异或,那么个数为偶数的元素异或后都变成了0,只留下了个数为奇数的那个元素
int findElementWithOddCount(vector<int> &a, int n)
{
int r = a[0];
for (int i = 0; i < n; ++i)
{
r ^= a[i];
}
return r;
}
有两个数出现奇数次
由n个元素组成的数组,n-2个数出现了偶数次,两个数出现了奇数次(这两个数不相等),如何利用O(1)的空间复杂度,找出这两个数
假设这两个数分别为a、b,将数组中所有元素异或之后结果为x,因为a != b
,所以x = a^b
,且x != 0
。因为x中第k位为1表示a或b中有一个数的第k位也为1,假设为a,将x与数组中第k位为1的数进行异或时,也即将a以及其他第k位为1的出现偶数次的数进行异或,化简即为x与a的异或,即为b
void findElement(vector<int> a, int length)
{
int s = 0;
int k = 0;
for (int i = 0; i < length; i++)
{
s ^= a[i];
}
int s1 = s;
int s2 = s;
while (!(s1 & 1))
{
s1 = s1 >> 1;
k++;
}
for (int i = 0; i < length; i++)
{
if ((a[i] >> k) & 1)
{
s ^= a[i];
}
}
cout << s << " " << s^s2);
}