问题描述
Given a non-empty array of integers, every element appears twice except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
给定一个非空整数数组,每个元素出现两次,只有一个元素例外。找到那一个。
注意:
你的算法应该具有线性运行时复杂度。你可以在不使用额外内存的情况下实现它吗?
输入: [2,2,1]
输出: 1
输入: [4,1,2,1,2]
输出: 4
Python 实现
第一种方法:最直接的思路,使用计数器计算数组中每个元素出现的个数,返回仅出现一次的那个元素
(但是如果输入数组很大的话,这种方法可能会消耗很多的额外内存)
class Solution(object):
def singleNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
cnt = {}
for num in nums:
if num in cnt:
cnt[num] += 1
else:
cnt[num] = 1
for num in cnt.keys():
if cnt[num] == 1:
return num
第二种方法:根据题目的意思,重复的元素只会出现两次,剩下唯一的一个元素只出现一次,所以我们可以用一个列表来处理,重复出现的元素从列表中移除,最后剩下的必然是唯一的只出现一次的那个元素。
class Solution(object):
def singleNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
single = []
for num in nums:
if num in single:
single.remove(num)
else:
single.append(num)
return single[0]
第三种方法:思路和第二种相似,不过能够避免使用额外的内存,就是使用 异或 运算,重复出现的元素经过两次异或运算后相互抵消,于是最后的运算结果的值就是唯一的那个只出现一次的元素。
class Solution(object):
def singleNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
ret = 0
for num in nums:
ret ^= num
return ret