只出现一次的数字

做~自己de王妃 提交于 2020-03-07 13:54:55

single number(只出现一次的数字)

描述

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

哈希

用一个哈希表,遍历数组时,若当前元素不在哈希表中,则如哈希表,若已经在哈希表中了,则不是该元素,将该元素从哈希表中删除,哈希表中剩下的最后一个元素就是只出现一次的数字。

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        map<int, bool> hash;
        for(auto i : nums)
        {
            if(hash.find(i) != hash.end())
                hash.erase(i);
            else
                hash[i] = true;
        }
        return hash.begin()->first;
    }
};

异或

  • a ^ 0 = a
  • a ^ a = 0
  • a ^ b ^ c = a ^ (b ^ c)
    所以可以这么理解,所有有两个相同数组的异或后结果都为0,只剩下那一个数组和0异或。
class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int a = 0;
        int len = nums.size();
        for(int i=0; i<len; i++)
        {
            a ^= nums[i];
        }
        return a;
    }
};

只出现一次的数组2

描述

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

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

哈希

还是可以用上面的哈希表来做,并且可以通过。

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        map<int, int> hash;
        int len = nums.size();
        for(int i=0; i<len; i++)
        {
            if(hash.find(nums[i]) != hash.end())
                hash[nums[i]]++;
            else
                hash[nums[i]] = 1;
        }
        int i = 0;
        for(i=0; i<len; i++)
        {
            if(hash[nums[i]] == 1)
                break;
        }
        return nums[i];
    }
};
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!