找到单个奇数个数字
一堆数字中,有奇数个a,其他数字都为偶数个,找到这个a
#include <iostream>
using namespace std;
int findOddNum(int* pArr, int len)
{
int eor = 0;
for( int i=0; i<len; i++ )
{
eor ^= pArr[i];
}
return eor;
}
int main(void)
{
int arr[] = {0, 0, 1, 1, 2, 2, 3, 4, 4};
cout << "one odd number: " << findOddNum(arr, sizeof(arr)/sizeof(arr[0])) << endl;
return 0;
}
找到两个奇数个数字
一堆数字中,有奇数个a和奇数个b,其他数字都为偶数个,找到a和b
void findTwoOddNum(int* pArr, int len, int& a, int& b)
{
int eor = 0, eorx = 0, rightOne = 0;
// 先获取a^b
for( int i=0; i<len; i++ )
{
eor ^= pArr[i];
}
// 拿到a^b中位为1的位置
rightOne = eor & (~eor + 1); // 提取最右侧的1
for( int i=0; i<len; i++ )
{
// 对只有那一位为1的值异或,获取a或者b中的一个
if( pArr[i] & rightOne > 0 )
{
eorx ^= pArr[i];
}
}
a = eor ^ eorx;
b = eor ^ a;
}
int main(void)
{
int a=0, b=0;
int arr[] = {0, 0, 1, 1, 2, 2, 3, 4};
findTwoOddNum(arr, sizeof(arr)/sizeof(arr[0]), a, b)
cout << "two odd number: " << a << ", " << b << endl;
return 0;
}