给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
示例 1:
输入: [2,2,1] 输出: 1
示例 2:
输入: [4,1,2,1,2] 输出: 4
解题思路一:
自身解法:利用count函数,结果虽然出来了,但是很垃圾
代码实现:
def singleNumber(nums):
for i in range(len(nums)):
if nums.count(nums[i]) == 1:
return nums[i]
l1 = [1, 2, 1, 2, 3, 3, 4]
ret = singleNumber(l1)
print(ret)
输出:
解法二:
借助额外的数组空间
代码实现:
# 借助额外的数组空间
def singleNumber(nums):
temp = []
for i in nums:
if i in temp:
temp.remove(i)
else:
temp.append(i)
return temp[0]
l1 = [1, 2, 1, 2, 3, 3, 4]
ret = singleNumber(l1)
print(ret)
输出:
解法三:
异或运算:
- 任何数和自己做异或运算,结果为 0,即 a⊕a=0 。
- 任何数和 0做异或运算,结果还是自己,即 a⊕0=a。
- 异或运算中,满足交换律和结合律,也就是 a⊕b⊕a=b⊕a⊕a=b⊕(a⊕a)=b⊕0=b
代码实现:
from functools import reduce
def singleNumber(nums):
return reduce(lambda x, y: x ^ y, nums)
l1 = [1, 2, 1, 2, 3, 3, 4]
ret = singleNumber(l1)
print(ret)
输出:
解法四:
利用数学思想:
- 只有一个数出现一次,每个不同的数总和*2作差
代码实现:
def singleNumber(nums):
return 2*sum(set(nums)) - sum(nums)
l1 = [1, 2, 1, 2, 3, 3, 4]
ret = singleNumber(l1)
print(ret)
输出: