八叶一刀·无仞剑

万物流转,无中生有,有归于无

导航

[leetcode]只出现一次的数字

Posted on 2020-10-30 17:59  闪之剑圣  阅读(111)  评论(0编辑  收藏  举报

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

说明:

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

示例 1:

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

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

这道题我第一次看到是考虑建立一个dict,dict的key是数组的值,dict的val是该数字出现的次数,最后找到数字为1的就可以。代码如下:

class Solution(object):
    def singleNumber(self, nums):
	dic={}
	for num in nums:
		if num in dic:
			dic[num]=2
		else:
			dic[num]=1
	for item in dic:
		if dic[item]==1:
			return item

但是这样实现实际上需要额外建立一个dict,在空间上有一定损耗。
更巧妙的方法是使用异或操作,两个相同的数异或结果为0,两个不同的数异或结果为1,一个数跟0异或是这个数本身。
也就是说:
aba = b
所以可以定义一个整数,初始化为0,并用该数依次与列表中元素进行异或操作,最后的结果肯定就是只出现过一次的那个数!
代码如下:

class Solution():
    def singleNumber(self, nums):
        num = 0
        for i in nums:
            num ^= i
        return num