力扣-136-只出现一次

传送门

方法一:异或运算

异或运算满足交换律和结合律:a⊕b⊕a=b⊕a⊕a=b⊕(a⊕a)=b⊕0=b

因为整数数组中的数字只能出现一次或者两次,两个相同数字的异或是0,那么将数组中的所有数字做异或运算后,出现两次的数字两两异或后变成0,出现一次的数字和0异或后还是本身。

/*位运算,将vector中的所有数字均进行异或,出现两次的数字变成零*/
class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int len = nums.size();
        for(int i = 1; i < len; i++) {
            nums[0] ^= nums[i];
        }
        return nums[0];
    }
};

 

方法二:Map

#include <map>
using namespace std;
class Solution {
private:
    map<int,int> hash;
public:
    int singleNumber(vector<int>& nums) {
        int len = nums.size();
        int result;
        for(int i = 0; i < len; i++){
            hash[nums[i]] += 1; 
        }
        for(int i = 0; i < len; i++){
            if(hash[nums[i]] == 1)
                result = nums[i];
        }
        return result;
    }
};

 

Map用来存一个数字出现的次数即可

 

posted @ 2020-08-04 11:44  Peterxiazhen  阅读(95)  评论(0编辑  收藏  举报