题目描述:
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
思路:
如果数组中只有一个只出现一次的数字,所有数字的异或结果就是要找的数字。现在有两个只出现一次的数字,所有数字的异或结果其实就是这两个数字的异或。按照结果的第一个数字1的位置把所有数字分成两个数组。分别异或,即找到两个数字。
代码:
class Solution {
public:
void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
*num1 = *num2 = 0;
vector<int>::iterator iter = data.begin();
while(iter != data.end()) {
*num1 ^= *iter;
iter += 1;
}
int fir0_bit = find_fir0_bit(*num1);
iter = data.begin();
*num1 = *num2 = 0;
int temp = (1<<fir0_bit);
while(iter != data.end()) {
if ((*iter&temp)) {
*num1 ^= *iter;
}else {
*num2 ^= *iter;
}
iter += 1;
}
}
int find_fir0_bit(int num) {
int ans = 0;
while((num&1) == 0) {
ans++;
num >>= 1;
}
return ans;
}
};
对指针有点迷茫,疯狂RE。
拖延着,不想写论文的博客。因为…没看懂。