leetcode 137. 只出现一次的数字(2)

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现三次。找出那个只出现了一次的元素。

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:

输入: [2,2,3,2]
输出: 3
示例 2:

输入: [0,1,0,1,0,1,99]
输出: 99

思路一
1.新建列表a=[],遍历原列表
2.原列表元素不在新列表中,则将这个元素放进新列表中
3.若新列表中存在原列表元素,则删除新列表中的这个元素
4.返回新列表中的元素 a=[0]

class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        a = []
        for i in nums:
            if i not in a:
                a.append(i)
            else:
                a.remove(i)
        return a[0]

思路二
count()方法直接找到该元素

class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        
        for i in nums:
            if nums.count(i) ==1:
                return i

思路三
利用set()创造一个无序不重复的元素集,然后利用原数组所有元素的和比新的元素集的三倍少两个一样的数的原理

class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        sum1 = 0
        for i in nums:
            sum1 += i
        new_nums = set(nums)
        sum2 = 0
        for i in new_nums:
            sum2 += i
        return int((sum2*3-sum1)/2)
            

思路四
使用python的异或操作,0异或任何数不变,任何数与自己异或为0。a⊕b⊕a=b。异或满足加法结合律和交换律。(俺也是看其他大佬的答案才知道还有这东西)这是各位大佬需要的资料

class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        a=0
        b=0
        for i in nums:
            a=a^i&(~b)
            b=b^i&(~a)
        return a

顺便求个赞,阔以不,各位大佬!

你可能感兴趣的:(leetcode 137. 只出现一次的数字(2))