美文网首页
leetcode只出现一次的数字

leetcode只出现一次的数字

作者: 看五年前自己的文章真是唏嘘不已 | 来源:发表于2018-07-22 07:28 被阅读0次

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

说明:

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

示例 1:

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

示例 2:

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

我的解法

class Solution:
    def singleNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        for i,j in enumerate(nums):
            #每次遍历都要查询n-1次,因此这种算法的时间复杂度是O(n^2),空间复杂度是O(1)
            if j not in nums[:i] and j not in nums[i+1:]:
                return j

结果超时了
一种可行的解法是利用异或运算.

首先介绍一下异或运算的定义:
如果两个数据的二进制对应的位相异时,结果中该位为1,否则为0.
例如2异或3,表示为2^3,即00000010^00000011=00000001,也就是1.

由定义可知,异或运算满足一下几个性质:
1.异或运算满足交换律,即对于任意的a,b,有a^b=b^a.也就是说异或运算与位置无关
2.对于任意的a,0与a异或的结果是a
3.对于任意的a,a^a的结果是0

再回到这题,因为异或运算与位置无关,因此数组中相同的数,无论他们的位置在哪里,都可以交换到一起,异或运算的结果是0,而0与任何一个数异或的结果是那个数本身.
具体到示例2就是4^1^2^1^2=1^1^2^2^4=0^4=4
因此,代码如下

class Solution():
    def singleNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        num = 0
        for i in nums:
            num ^= i
        return num

虽然我没做出来,但是我发现并证明了异或运算的交换律啊(强行安慰自己)

相关文章

网友评论

      本文标题:leetcode只出现一次的数字

      本文链接:https://www.haomeiwen.com/subject/ymxlmftx.html