一. 题目
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1] 输出: 1
示例 2:
输入: [4,1,2,1,2] 输出: 4
二. 思路及代码
法1. 使用hash table
因为只有某个元素出现一次,其余每个元素均出现两次,所以可以使用增减操作来把出现两次的元素排除。
但是如果用list的append和remove的方法会出现超时报错,所以使用dict 作为一个hash table来增删,最后剩下的键为只出现一次的元素。
class Solution(object):
def singleNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
hash_dict = {} # 用list.append; list.remove会超时。
for i, v in enumerate(nums):
if v in hash_dict:
del hash_dict[v]
else:
hash_dict[v] = v
return list(hash_dict.keys())[0]
法2. 使用按位异或
相同为0,不同为1.
一个数字和自己异或一次会变成0。
class Solution(object):
def singleNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
sum = 0
for i in nums:
sum = sum ^ i
return sum