题目描述
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
解法:
1.了解几个常识:
a.了解两个相同的数字异或结果为0
b.任何数字与0进行异或结果为数字本身
c.任何数字与1相与,只有最低位(右边)为1时候,才等于1
2.一种对数组分成两组的方法,比如2(10)和3(11)异或以后最低位为1,那么就可以根据最低位是否为1对数字进行分组,两组里必然都有只出现一次的数字
class Solution {
public:
void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
int len = data.size();
if(len < 2) return;
int numOfOne = 0;
for(int i = 0; i < len; i++)
numOfOne ^= data[i];
int indexOfOne = 0;
indexOfOne = findFirstOne(numOfOne);
for(int i = 0; i < len; i++) {
if(isOne(data[i], indexOfOne))
*num1 ^= data[i];
else
*num2 ^= data[i];
}
}
int findFirstOne(int num) {
int indexOfOne = 0;
while((num & 1)== 0 && (indexOfOne < 8*sizeof(int))) { //移动到直到最右边数字为1
++indexOfOne;
num = num >> 1;
}
return indexOfOne; //其实这个1的坐标是从右往左,从0开始的
}
bool isOne(int num, int indexOfOne) {
num = num >> indexOfOne; //向左移动几位,看最后一位是不是1,是的话返回true
return (num & 1);
}
};