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)实现的。
参考资料
位运算之异或 ( 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,因为:
参考资料
相关文章推荐
- LeetCode 137 Single Number II(仅仅出现一次的数字 II)(*)
- Leetcode刷题24-136.只出现一次的数字(C++)
- leetcode-探索-初级-数组-只出现一次的数字-java
- LeetCode 136 Single Number(仅仅出现一次的数字)
- leetcode_137. Single Number II 只出现一次的数字 II 偏离了题目考点,主要是为了写下java
- leetcode 只出现一次的数字
- LeetCode刷题之一:寻找只出现一次的数字
- 只出现一次的数字(LeetCode)
- 寻找只出现一次的数字(LeetCode: Single Number II)
- LeetCode:只出现一次的数字
- [leetcode]2018.3.22 只出现一次的数字
- leetcode之136 只出现一次的数字
- 【LeetCode】- Single Number(从数组中找出只出现一次的数字)
- Leetcode刷题22-260.只出现一次的数字 III(C++)
- [leetcode]只出现一次的数字
- leetcode136 只出现一次的数字
- Java&LeetCode 初入门——136. 只出现一次的数字
- 【LeetCode】#136只出现一次的数字(Single Number)
- LeetCode 136 Single Number 出现一次的数字
- leetcode - 136 - 只出现一次的数字