题解 | #数组中只出现一次的两个数字#
数组中只出现一次的两个数字
http://www.nowcoder.com/practice/389fc1c3d3be4479a154f63f495abff8
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param array int整型vector
* @return int整型vector
*/
vector<int> FindNumsAppearOnce(vector<int>& array) {
// write code here
for(int i=0;i<array.size();i++)
eor=eor^array[i];
//循环结束后eor的值就是那两个数的异或结果
//因为已经知道该数组里面的所有数都是>0的
//所以eor的值一定不为0,所以把eor写成二进制数后一定至少有一位为1
//现在我们要找出eor二进制形式下最右边的1
int right=(eor&((~eor)+1));
int eor_1=0;
for(int i=0;i<array.size();i++)
{
if((array[i]&right)!=0)
eor_1=eor_1^array[i];
}
cout<<eor_1<<endl;
int eor_2=0;
eor_2=eor^eor_1;
vector<int > A;
A.push_back(eor_1>eor_2?eor_2:eor_1);
A.push_back(eor_1>eor_2?eor_1:eor_2);
return A;
}
};
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param array int整型vector
* @return int整型vector
*/
vector<int> FindNumsAppearOnce(vector<int>& array) {
// write code here
//本题采用异或运算
//这个垃圾编译器真快把我搞疯了,加了很多看不懂的括号。。
int eor=0;for(int i=0;i<array.size();i++)
eor=eor^array[i];
//循环结束后eor的值就是那两个数的异或结果
//因为已经知道该数组里面的所有数都是>0的
//所以eor的值一定不为0,所以把eor写成二进制数后一定至少有一位为1
//现在我们要找出eor二进制形式下最右边的1
int right=(eor&((~eor)+1));
int eor_1=0;
for(int i=0;i<array.size();i++)
{
if((array[i]&right)!=0)
eor_1=eor_1^array[i];
}
cout<<eor_1<<endl;
int eor_2=0;
eor_2=eor^eor_1;
vector<int > A;
A.push_back(eor_1>eor_2?eor_2:eor_1);
A.push_back(eor_1>eor_2?eor_1:eor_2);
return A;
}
};