您的位置:首页 > 其它

LeetCode 只出现一次的数字

2019-03-09 10:00 211 查看

题目

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

示例

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(N2)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)
实现的。

参考资料
  1. Python基本数据类型操作的时间复杂度
  2. What happens when you mess with hashing in Python
  3. Hashing

位运算之异或 ( 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
,因为:

4 ^ 1 ^ 2 ^ 4 ^ 2 = (4 ^ 4) ^ (2 ^ 2) ^ 1 = 0 ^ 0 ^ 1 = 1
参考资料
  1. 异或操作
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: