题目描述


alt


**题解1:使用map<int,int> key为元素,int为元素个数

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param array int整型vector 
     * @return int整型vector
     */
    vector<int> FindNumsAppearOnce(vector<int>& array) {
        // write code here
        map<int,int> m;
        for(int i =0;i<array.size();i++){
            if(m.find(array[i])==m.end())
                m.insert(make_pair(array[i],1 ));
            else
                m.erase(m.find(array[i]));
               //或者对该元素的value进行计数 m[array[i]]++;
        }
        cout<<m.size()<<endl;
        vector<int> v;
        for(map<int,int>:: iterator it=m.begin();it!=m.end();it++){
                v.push_back((*it).first);
        }
        sort(v.begin(), v.end());
        return v;
    }
};

**题解2:位运算


位运算规则

  (1) 0^0=0,0^1=1 0异或任何数=任何数

  (2) 1^0=1,1^1=0 1异或任何数=任何数取反

  (3) 任何数异或自己=把自己置0


图解为某大佬的,在此借鉴。 alt


class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param array int整型vector 
     * @return int整型vector
     */
    vector<int> FindNumsAppearOnce(vector<int>& array) {
        // write code here
        //题解2:位运算
        int temp = 0;
        //对所有数进行异或,
        for(int i:array){
            temp^=i;
        }//本题目temp = 0010 ,1在倒数第二位
        //位运算进行分组
        // 找到那个可以充当分组去进行与运算的数
        // 从最低位开始找起
        int mask = 1; //如
        while((temp&mask) == 0){
            mask <<= 1;
        }//mask = 0010
        //根据倒数第二位是不是1进行分组,因为只有两个数字重复,所以分组的同时进行数据恢复
        int a = 0;
        int b = 0;
        for(int i:array){
            if((i & mask ) == 0)//分为倒数第二位不为0的一组
                a^=i;
            else
                b^=i;
        }
        return {min(a,b),max(a,b)};
        
    }
};