力扣(leetcode) 136. 只出现一次的数字 (枚举法) (哈希表法) (异或法)
原创
©著作权归作者所有:来自51CTO博客作者深度不学习的原创作品,请联系作者获取转载授权,否则将追究法律责任
题目在这:https://leetcode-cn.com/problems/single-number/
思路分析:
这道题题意很容易明白,找只出现了一次的数字。
法一:
直接暴力法。遍历然后统计出现的次数。
完整代码
for i in nums:
if nums.count(i) == 1: # 当有一个元素仅出现一次的时候,返回该数
return
法二:
使用哈希表存储元素出现的次数,然后找到出现一次的。
这里顺带提一句 enumerate()方法和items() 方法,
enumerate() 方法:
会输出元素和该元素对应的下标。
比如:
seq = ['one', 'two', 'three']
输出:
0 one 1 two 2 three
items() 方法
以列表返回可遍历的(键, 值) 元组数组。
比如
dict = {'Google': 'www.google.com', 'Runoob': 'www.runoob.com', 'taobao': 'www.taobao.com'}
for key,values in dict.items():
print key,values
输出:
Google www.google.com
taobao www.taobao.com
Runoob www.runoob.com
完整代码:
hashmap = {}
for i in nums:
if i in hashmap: # 检查该元素是否在哈希表里,在的话其对应的value加1
hashmap[i] += 1
continue
hashmap[i] = 1 # 不在哈希表里。则让他加入哈希表,对应value为1
for key,value in hashmap.items():
if value == 1: # 遍历找到value为1对应的key的值。
print(key)
法三
使用异或的属性找到只出现了一次的数字。
首先几个知识点:
图中圆加号表示异或。
看懂了上面。我们就可以使用异或的性质完成本题。(所有数异或,最后剩下的一定是仅出现了一次的元素)
这里说一下。题目中已经明确。除了某个元素只出现一次以外,其余每个元素均出现两次
。
如果题目中没有这样的说明,则上面的方法就用不了了,因为 A ^ A ^ A = 0 ^ A = A
完整代码
= nums[0] # 将第一个元素给了res
for i in range(1,len(nums)):
res ^= nums[i] # 逐步异或所有的元素 ,最后剩下的是仅出现一次的元素
print(res)