由n个元素组成的数组,n-2个数出现了偶数次,两个数出现了奇数次,且这两个数不相等,如何用O(1)的空间复杂度,找出这两个数
思路分析:
方法一:涉及到两个数,就要用到异或定理了:若a^b=x,则a=b^x,b=x^a。对于这道题,假设这两个数分别为a、b,将数组中所有元素异或之后结果为x,因为a!=b,所以x=a^b,且x!=0,判断x中位为1的位数,只需要知道某一个位为1的位数k,如00101100,k可以取2或者3,或者5.因为x中第k位为1表示a或b中有一个数的第k位也为1,假设为a,将x与数组中第k位为1的数进行异或时,也即将x与a以及其他第k位为1的出现过偶数次的数进行异或,化简即为x与a异或,最终结果即为b。
#include "stdafx.h"
#include<string>
using namespace std;
void FinNum(int A[],int len)
{
int s= 0;
int count = 0;
int a = 0;
int b = 0;
for (int i = 0; i < len; i++)
s = s^A[i];
int s1 = s;
while (!(s1 & 1))
{
s1 = s1 >> 1;
count++;
}
b = s;
for (int i = 0; i < len; i++)
{
if ((A[i]>>count)&1)
b = b^A[i];
}
a = b^s;
printf("a=%d , b=%d", a,b);
}
int main()
{
int A[] = { 1, 2, 3, 2, 4, 3, 5, 1 };
int len_ = 8;
FinNum(A, len_);
return 0;
}