剑指Offer56-II-数组中数字出现的次数II

剑指Offer56-II-数组中数字出现的次数II

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

示例 1:


输入:nums = [3,4,3,3]

输出:4

示例 2:


输入:nums = [9,1,7,9,7,9,7]

输出:1

限制:

  • 1 <= nums.length <= 10000

  • 1 <= nums[i] < 2^31

来源:力扣(LeetCode)

链接:力扣

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

一解

使用位运算,由于“除一个数字只出现一次之外,其他数字都出现了三次”,因此对所有数字的某一位进行求和,其结果是 3 或者 1 或者 0 ,对其 % 3,必然是 0 或者 1 。

1 % 3 = 1

res = 1

3 % 3 = 0

res = 10

3 % 3 = 0

res = 100


class Solution:

    def singleNumber(self, nums: List[int]) -> int:

        bit_mask = 1 << 31

        res = 0

        for j in range(32):

            bit_sum = 0

            for num in nums:

                if bit_mask & num: bit_sum += 1

            res = (res<<1) + bit_sum%3

            bit_mask >>= 1

        return res

  • 时间复杂度:O(n)

  • 空间复杂度:O(1)