题目
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
示例
input: [2, 2, 1]
output: 1
input: [4,1,2,1,2]
output: 4
解法
Set ( Python )
class Solution:
def singleNumber(self, nums: List[int]) -> int:
s = set()
for x in nums:
if(x not in s):
s.add(x)
else:
s.remove(x)
return list(s)[0]
基本思路
对List
中的元素进行遍历,如果出现了新的元素,就加入到set
中去;如果是第二次出现的元素,就将之从set
里除去,最后set
只剩下只出现一次的元素。
复杂度分析
时间复杂度为
O
(
N
2
)
O(N^{2})
O(N2),因为for
循环遍历了整个列表,时间开销为O(N)
,而且set
的add
和remove
函数在最坏情况下时间复杂度为O(N)
。由于使用了一个set()
,空间复杂度为O(N)
。
有人(包括我)会觉得这里不需要使用set
,直接用List
不就好了吗? 但是经过修改发现,这里如果将 s 声明为 []
, 将函数add
改成append
, 最后修改一下return
,这样的程序在 Leetcode 上的运行时间远远大于之前的代码。原因是因为 Python 中的List
是由数组实现的,set
是由dict(HashTable)
实现的。
参考资料
位运算之异或 ( Python )
class Solution:
def singleNumber(self, nums: List[int]) -> int:
ans = 0
for x in nums:
ans ^= x
return ans
基本思路
两个相同数的异或结果为0
,同时异或满足结合律和交换律,以及自反性。 假设现在有一组数[4,1,2,4,2]
,将其中的每一个数按顺序进行异或操作,你会发现最后的结果就是1
,因为: