位运算,一个数和它本身做异或运算结果为 0,即 a ^ a = 0;一个数和 0 做异或运算的结果为它本身,即 a ^ 0 = a。
中途需要划分A,B所在得组
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param array int整型vector
* @return int整型vector
*/
vector<int> FindNumsAppearOnce(vector<int>& array) {
// write code here
vector<int> res;
if(!array.size()){
return res;
}
int middle = 0;
for(int n:array){
middle ^= n;
}
int compare =1;
while((compare &middle)==0){ //判断异或结果的二进制第一位是否为1,为1则直接跳过该循环
compare <<=1;//为0则继续往后找,一直到找到为1的二进制位,该行代码也相当于compare *=2
}
int a = 0;
int b = 0;
for(int n:array){ //遍历数组,开始判断数字们的compare位是否为1
if((compare&n)==0){//如果该数字二进制的第某位为0,则分到数组一
a^=n; //对数组一进行异或,得到a
}else{ //如果该数字二进制的第某位为1,则分到数组二
b^=n; //对数组二进行异或,得到b
}
}
res.emplace_back(a>b?b:a);
res.emplace_back(a>b?a:b);
return res;
}
};
京公网安备 11010502036488号