题目来源(力扣. - 力扣(LeetCode),简单)
解题思路:
法一:消消乐法
准备一个pre集合,遍历nums列表,若num未在pre内,则添加进pre集合内,若存在,则将pre内与该数相同的数据删除,则最后留下的数据即为只出现一次的数据。
法二:位运算中的异或运算
已知异或运算时相同的数据进行异或运算将会得到0,而其他数据与0进行异或运算得到的为本身,因此我们可以对列表中的所有数据进行异或运算,最后得到的数据即为只出现一次的数据
优化:利用reduce函数重复执行xor(异或运算) Python reduce() 函数 | 菜鸟教程
代码实现:
法一:
pre = set()
for num in nums:
if num in pre:
pre.remove(num)
else:
pre.add(num)
return pre.pop()
法二:
x = 0
for num in nums:
x ^= num
return x
优化:
return reduce(xor,nums)
总结:
找准切入点--得到唯一元素->1.消除其他元素 2.直接遍历找到唯一元素(耗时过长,pass)
消除其他元素->做比较,有相同的消去->得到法一
->直接消除法(看其他人题解法)->得到法二