leecode:剑指offer56 数组中数字出现的次数

56-I 数组中找出出现次数为1的数,这种属于位运算
题目描述:

一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。

示例1:

输入:nums=[4,1,4,6]
输出:[1,6]或[6,1]

class Solution(object):
    def singleNumbers(self, nums):
        """
        :type nums: List[int]
        :rtype: List[int]
        """
        ret = 0
        a = 0
        b = 0

        # 所有数字异或
        for n in nums:
            ret ^= n
        
        # 找出异或结果里面第一个非0的,则两个出现1的数,在这里一定是不同的,根据0或1,对其他数分组异或,最后得到的结果就是出现1次的数
        h = 1
        while(ret & h == 0):
            h <<= 1
        for n in nums:
            if (h & n == 0):
                a ^= n
            else:
                b ^= n
        return [a, b]

这一系列可参考https://leetcode-cn.com/problems/shu-zu-zhong-shu-zi-chu-xian-de-ci-shu-lcof/solution/zhi-chu-xian-yi-ci-de-shu-xi-lie-wei-yun-suan-by-a/

56-II
题目描述

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

实例:

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

位运算,list的数的每一位和1做&运算,统计次数结果和3相除。得到出现次数为1的数在该位的数值。

class Solution(object):
    def singleNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        res = 0
        for i in range(31):
            cnt = 0
            bit = 1 << i
            for num in nums:
                if num & bit != 0:
                    cnt += 1
            if cnt % 3 != 0:
                res |= bit
        return res
上一篇:10 对称二叉树(leecode 101)


下一篇:05 二叉树的层平均值(leecode 637)