您的位置:首页 > Web前端

数组中只出现一次的数字

2016-03-21 17:50 239 查看


题目描述

一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
       数组中有两个数字只出现一次,但是其它数字都出现两次,这让我们想到了,整个数组中只有一个数字只出现一次,其它数字都出现两次的题目。如果是这样子的话,利用异或的性质--相同为0,相异为1,把所有数字进行异或就可以得到只出现一次的那个数字了。但是这个题目里面有两个只出现一次的数字,如果能够把它们分成两组,把这个题目转化成两个刚才那个题目就很简单了。

      有两个不同的数字,那么对这个数组中所有的数据进行异或肯定不为0,那我们可以找到不为0的那一位flag,把整个数组分开,所有flag位为1的为一组A,flag为0的为一组B,在相同的数字肯定在同一个组里面,A,B组就转换成那个子问题了,即数组中只有一个数字只出现一次。

class Solution {
public:
void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
int length = data.size();
if(length <2)
return ;
int result = 0;
for(int i = 0; i < length; i ++){
result ^= data[i];
}
unsigned int indexOf1 = FindFirstBitIs1(result);
*num1 = *num2 = 0;
for(int i = 0; i < length; i ++){
if(IsBit1(data[i], indexOf1))
*num1 ^= data[i];
else
*num2 ^= data[i];
}

}
unsigned int FindFirstBitIs1(int num){
int indexBit1 = 0;
while((num & 1) == 0 && (indexBit1 < 8 *sizeof(int))){
num = num >> 1;
++ indexBit1;
}
return indexBit1;
}

bool IsBit1(int num, unsigned int indexBit1){
return (num >> indexBit1) & 1;
}

};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  剑指offer 异或