时间限制:1秒 空间限制:32768K 热度指数:297128
本题知识点: 数组
题目描述
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
题目链接:题目链接
这题,我只想到了一半,就是一路异或数组中的各个值,异或的结果肯定就是只出现一次的两个数的异或值。然后,就没有然后了,想不到了。。。
能这么想是因为异或运算有两个性质:
1、0 ^ x = x;
2、x ^ x = 0;
然后又去大佬区看了一下思路,发现只要按数组中二进制最末位的1是否与异或结果的最末位1位置一样进行划分,再次异或就求出来了。
因为根据异或的特点,异或结果为1的数位,代表两个数在该位相反。
class Solution {
public:
void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
int len = data.size();
if (len < 2){
return ;
}
int temp = 0;
for (int i=0;i<len;i++){
temp = temp ^ data[i];
}
//cout<<temp<<endl;
if(temp == 0){
return ;
}
int index = 0;
int lowbit = temp & (-temp);//A&(-A)求二进制中的末位1的值
//cout<<index<<endl;
for(int i=0;i<len;i++){
int para = data[i];
if((para & (-para)) == lowbit){
*num1 ^= para;
//cout<<*num1<<" "<<i<<" "<<1<<endl;
}
else {
*num2 ^= para;
//cout<<*num2<<" "<<i<<" "<<2<<endl;
}
}
//cout<<*num1<<" "<<*num2<<endl;
return ;
}
};