力扣(leetcode) 136. 只出现一次的数字 python3

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()

你可能感兴趣的:(力扣(leetcode) 136. 只出现一次的数字 python3)