题目:

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

示例 1:
输入: [2,2,1]
输出: 1

示例 2:
输入: [4,1,2,1,2]
输出: 4

链接:https://leetcode-cn.com/problems/single-number

 

解法1:非线性时间

先把数组排序,然后依次遍历,找出唯一一个数字

解法2:线性时间,空间复杂度高

用hashmap去存储这些数字作为key,出现次数作为value,找出value=1的那个key

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        map<int,int> ret;
        for(auto i:nums)
        ret[i]++;
        for(auto i=ret.begin();i!=ret.end();i++)
        {
            if(i->second!=2)
            return i->first;
        }
        return 0;
    }
};

解法3:线性时间,空间复杂度O(1)

用异或运算,原理是0与任何数n异或后都是n,两个相同的数异或后结果都是0,即:

0^n=n,n^n=0

此解法性能最优,代码如下:

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int ret=0;
    for(int i=0;i<nums.size();i++)
        ret=ret^nums[i];
    return ret;
    }
};

 

荡尘涤污,重整河山,便在今日