异或定理

来源:互联网 发布:彭博商业周刊 知乎 编辑:程序博客网 时间:2024/05/22 15:08

由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;}


原创粉丝点击