位运算,一个数和它本身做异或运算结果为 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; } };