链接:数组中只出现一次的数字
题目详情:
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
分析:
X对应1的位两个数一定相反,于是找一个1的数将该异或值拆为两组:0、1,
显然该位对应为1的异或到一块一定是其中一个出现1次的数,
因为如果出现两次,那么两个会同时异或到一块,相当于0,
这样做是根据异或具有的交换律和结合律得到的。
这道题是数组中只出现一次的一个数字的变种,关键在于根据异或的结果将数字分为两组,由于数组中只有两个不同的出现一次的数字,所以一位就能够区别,那根据这个思路,如果数组中恰好有4个不同的数字呢?能否用2位异或值1的数字根据分组来区分呢?似乎也可以:00、01、10、11
Code:
class Solution {
#define SZ(V) (int)V.size()
public:
void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
*num1 = 0;
*num2 = 0;
int x = 0; //两个不同数的异或值
for (int i = 0; i < SZ(data); i++)
x ^= data[i];
int tag = x & (-x); // 随便找一个,不一定要第一个
for (int i = 0; i < SZ(data); i++)
if (tag & data[i])
*num1 ^= data[i];
else
*num2 ^= data[i];
}
};