剑指offer 56. 数组中出现数字的次数 3

题目:在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。  中等 

方法一:哈希表  时间复杂度O(n)  空间复杂度O(n)  

 

def singleNumber(nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        dic = {}
        for num in nums:
            if num not in dic:
                dic[num] = 1
            else:
                dic[num] += 1
        for num in dic:
            if dic[num] == 1:
                return num

 

方法二:位运算  时间复杂度O(n)  空间复杂度O(1) 

思想就是统计二进制每一位出现1的次数,最后对3取余,取余剩下的各位就是只出现一次的数,但慢的一比

def singleNumber(nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        count = [0] * 32
        for num in nums:
            for i in range(32):
                count[i] += num & 1
                num >>= 1
        count = count[::-1]
        res,m = 0,3
        for i in range(32):
            res <<= 1
            res |= count[i] % 3
        return res 

方法三:用二进制位定义三进制  时间复杂度O(n)  空间复杂度O(1)  

def singleNumber(nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        ones,twos = 0,0
        for num in nums:
            ones = ones ^ num & ~twos
            twos = twos ^ num & ~ones
        return ones

 

posted @ 2022-07-24 21:19  Liang-ml  阅读(27)  评论(0)    收藏  举报