力扣(leetcode) 136. 只出现一次的数字 (枚举法) (哈希表法) (异或法)

题目在这:https://leetcode-cn.com/problems/single-number/

思路分析:

这道题题意很容易明白,找只出现了一次的数字。

法一:

直接暴力法。遍历然后统计出现的次数。

完整代码

for i in nums:
    if nums.count(i) == 1:  # 当有一个元素仅出现一次的时候,返回该数
        return i

法二:

使用哈希表存储元素出现的次数,然后找到出现一次的。
这里顺带提一句 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

完整代码


res = nums[0]  # 将第一个元素给了res

for i in range(1,len(nums)):
    res ^= nums[i]  # 逐步异或所有的元素 ,最后剩下的是仅出现一次的元素
print(res)


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深度不学习!!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值