2019/3/18/11.44
1. 垃圾解法:用字典(hash)来计数
执行用时 : 116 ms, 在Single Number的Python3提交中击败了8.54% 的用户
内存消耗 : 15.1 MB, 在Single Number的Python3提交中击败了0.88% 的用户
class Solution:
def singleNumber(self, nums: List[int]) -> int:
count = {}
for i in nums:
if i in count:
count[i] += 1
else:
count[i] = 1
for i in count:
if count[i] == 1:
return i
return None
2. 也是垃圾解法,慢死了 : 直接计算个数
执行用时 : 7356 ms, 在Single Number的Python3提交中击败了2.23% 的用户
内存消耗 : 14.8 MB, 在Single Number的Python3提交中击败了0.88% 的用户
class Solution:
def singleNumber(self, nums: List[int]) -> int:
for i in nums:
if nums.count(i) == 1:
return i
return None
3. 异或解法 : 数学定理 异或同一个数两次,原数不变
交换律:a ^ b ^ c <=> a ^ c ^ b
任何数于0异或为任何数 0 ^ n => n
相同的数异或为0: n ^ n => 0
a = [2,3,2,4,4]
2 ^ 3 ^ 2 ^ 4 ^ 4等价于 2 ^ 2 ^ 4 ^ 4 ^ 3 => 0 ^ 0 ^3 => 3
执行用时 : 88 ms, 在Single Number的Python3提交中击败了11.25% 的用户
内存消耗 : 14.7 MB, 在Single Number的Python3提交中击败了0.88% 的用户
class Solution:
def singleNumber(self, nums: List[int]) -> int:
a = 0
for i in nums:
a = a ^ i
return a
4. 贱贱的解法
把独特的数都找出来*2 ,这样就是所有的数都是两份了,然后减去原本的数组, 这样多的那个就出来了
执行用时 : 56 ms, 在Single Number的Python3提交中击败了64.42% 的用户
内存消耗 : 14.9 MB, 在Single Number的Python3提交中击败了0.88% 的用户
class Solution:
def singleNumber(self, nums: List[int]) -> int:
return 2*sum(set(nums))-sum(nums)
5. 嗯,剔除法吧,思路还行
执行用时 : 2000 ms, 在Single Number的Python3提交中击败了3.97% 的用户
内存消耗 : 14.1 MB, 在Single Number的Python3提交中击败了0.88% 的用户
class Solution:
def singleNumber(self, nums: List[int]) -> int:
while nums:
this_num = nums.pop()
if this_num not in nums:
return this_num
else:
nums.remove(this_num)
# 2
def singleNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
s=set()
for n in nums:
if n not in s:
s.add(n)
else:
s.remove(n)
return s.pop()