1. 题目
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
2. 题解
2.1 解法1
from typing import List
class Solution:
def singleNumber(self, nums: List[int]) -> int:
if len(nums) == 0:
return 0
result = {}
for i in nums:
result[i] = result.setdefault(i, 0) + 1
for key, value in result.items():
if value == 1:
return key
if __name__ == "__main__":
s = Solution()
num = [4,1,2,1,2]
a = s.singleNumber(num)
print(a)
2.2 解法2
from collections import defaultdict
from typing import List
class Solution:
def singleNumber(self, nums: List[int]) -> int:
hash_tab = defaultdict(int)
for n in nums:
hash_tab[n] += 1
for m in hash_tab:
if hash_tab[m] == 1:
return m
if __name__ == "__main__":
s = Solution()
a = s.singleNumber([2,2,1])
print(a)
2.3 解法3(异或法)
from collections import defaultdict
from typing import List
# 异或法
class Solution:
def singleNumber(self, nums: List[int]) -> int:
ret = 0
for n in nums:
ret = ret ^ n # a ^ a = 0 a ^ 0 = a a ^ b ^ a = a ^ a ^ b a ^ b ^ a = a ^ a ^ b = b
return ret
if __name__ == "__main__":
s = Solution()
a = s.singleNumber([2,2,1])
print(a)
2.4 解法4 (数学法)
from collections import defaultdict
from typing import List
# 数学法
# 假设 nums = [a, a, b, b, c]
# 结果为 2 * (a + b + c) - (a + a + b + b + c)
class Solution:
def singleNumber(self, nums: List[int]) -> int:
return 2 * (sum(set(nums))) - sum(nums)
if __name__ == "__main__":
s = Solution()
a = s.singleNumber([2,2,1])
print(a)