2020.3.22

136. 只出现一次的数字

难度简单1106

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

说明:

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

示例 1:

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

示例 2:

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

来源:https://leetcode-cn.com/problems/single-number/

 这道题目我看到题解中有一种解法,利用哈希表,其实STL中的哈希表(严格意义上说,这并不是哈希表)我一直没用过,今天算是第一次尝试,

class Solution {
public:
    int singleNumber(vector& nums) {
        mapnmap;    //创建哈希表
        for(int i = 0;i < nums.size();i++)
        {
            if(nmap.find(nums[i]) != nmap.end())
            {
                nmap.erase(nmap.find(nums[i]));    //find函数返回找到内容的迭代器
            }
            else nmap[nums[i]] = 1;
        }
        return nmap.begin()->first;
    }
};

这种哈希表解决了我手写普通表的一个问题,我平时用数组保存数据,但是数组下标不能是负数啊,这就很烦人!!!!

这种写法呢,很好,效率也很高,但是用到了额外空间,能不能不用呢?

方法二:

肯定是可以的,这就需要用到我今天学到的那个位运算---异或

首先,介绍一下异或的运算规则:

异或其实就是不进位的二进制加法

0^0 = 0

0^1 = 1

1^0 = 1

1 ^1 = 0

简言之:相同为0,不同为1

1、a ^ 0 = a

2、a ^ a = 0

3、a ^b ^ a = (a ^ a) ^ b = 0 ^ b = b

那么结果就出来了

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

其实吧,还有一种别的方法:把这些数据装到一个set容器中,然后set() * 2 - sum(nums);不过这个方法只适合其他数字出现次数相同的时候,普适性不强。

你可能感兴趣的:(学习笔记)