0
点赞
收藏
分享

微信扫一扫

LeetCode136_只出现一次的数字


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)


举报

相关推荐

0 条评论