136.只出现一次的数字
给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。
示例 1 :
输入:nums = [2,2,1]
输出:1
示例 2 :
输入:nums = [4,1,2,1,2]
输出:4
示例 3 :
输入:nums = [1]
输出:1
很明显,是直接不允许你使用暴力搜索的方式解题,所以我们需要考虑其他的数据结构.这里明显是在统计出现的次数,也就是一个哈希表的问题,key为num,value为出现的次数.
class Solution:
def singleNumber(self, nums: List[int]) -> int:
count = defaultdict(int) # 这样如果出现没有key的时候就不会报错了?会为不存在的key创建1个0的value
for num in nums:
count[num] += 1
for k, v in count.items():
if v == 1:
return k
return 0
出了哈希表之外,哈希集合同样可以解决
class Solution:
def singleNumber(self, nums: List[int]) -> int:
hashset = set()
for num in nums:
if num in hashset:
hashset.remove(num)
else:
hashset.add(num)
return hashset.pop()
当然,也有秒杀解法,直接通过异或计算即可:
class Solution:
def singleNumber(self, nums: List[int]) -> int:
# 最佳方法,循环异或,最后剩下的就是只出现了一次的.
result = 0
for num in nums:
result ^= num
return result
这里附带学习一下哈希表和哈希集合的一些常用接口api的格式
一、哈希集合(set)的核心接口
set 用于存储无序、唯一的元素,核心操作围绕元素的增删查。
方法 / 操作 功能描述 示例
add(element) 向集合中添加元素(若元素已存在则不操作) s.add(5)
remove(element) 移除集合中的指定元素(若元素不存在则抛出 KeyError) s.remove(5)
discard(element) 移除集合中的指定元素(若元素不存在则不操作,无报错) s.discard(5)
pop() 随机移除并返回集合中的一个元素(空集合调用会抛出 KeyError) s.pop()
clear() 清空集合中所有元素 s.clear()
copy() 返回集合的浅拷贝 s2 = s.copy()
in 关键字 判断元素是否在集合中(成员检测) 5 in s
len(s) 返回集合中元素的个数 len(s)
集合运算方法 union()(并集)、intersection()(交集)、difference()(差集)等 s1.union(s2)
二、哈希表(dict/defaultdict)的核心接口
dict 用于存储键值对(key-value),核心操作围绕键的增删查改。
方法 / 操作 功能描述 示例
d[key] = value 添加或修改键值对(若键存在则更新值,否则新增) d['name'] = 'Alice'
d.get(key, default) 获取键对应的值(若键不存在则返回 default,默认 None) d.get('age', 0)
d.pop(key, default) 移除并返回键对应的值(若键不存在则返回 default,无默认则抛 KeyError) d.pop('name')
del d[key] 移除指定键值对(若键不存在则抛出 KeyError) del d['name']
d.keys() 返回所有键的视图(可迭代) for key in d.keys():
d.values() 返回所有值的视图(可迭代) for val in d.values():
d.items() 返回所有键值对的视图(元组形式,可迭代) for k, v in d.items():
d.update(other) 用另一个字典 / 键值对更新当前字典(键存在则覆盖,否则新增) d.update({'age': 18})
d.clear() 清空字典中所有键值对 d.clear()
d.copy() 返回字典的浅拷贝 d2 = d.copy()
in 关键字 判断键是否在字典中(仅检测键,不检测值) 'name' in d
len(d) 返回字典中键值对的个数 len(d)
三、核心差异总结
维度 哈希集合(set) 哈希表(dict)
存储内容 单一元素(无值) 键值对(key: value)
核心操作对象 元素本身 键(key)
特有方法 集合运算(union、intersection等) 键值对相关(keys()、values()、items()等)
无序性 元素无序(Python 3.7+ 仍无序) 键值对有序(Python 3.7+ 按插入顺序)
需要注意的就是如果key不存在的时候是很容易报错的,所以比较推荐的是使用defaultdict进行初始化,然后根据key的类型进行对应的初始化即可.比如defaultdict(int),defaultdict(str)
324

被折叠的 条评论
为什么被折叠?



