剑指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

浙公网安备 33010602011771号