菠菜网

濮阳租房网:面试题56 - I. 数组中数字泛起的次数

时间:2个月前   阅读:45   评论:1

面试题56 - I. 数组中数字泛起的次数

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

示例 1:

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

示例 2:

输入:nums = [1,2,10,4,1,4,3,3]
输出:[2,10] 或 [10,2]

思绪

相同数的异或效果为0。问题中有两个数(a,b)只泛起一次,其余的数泛起了两次,若是将数组所有举行一次 异或 获得的效果为 a和b 的异或效果。

若是只有一个数泛起 1 次,其余的数泛起两次会怎样?异或效果就是该数。以是我们实验把数组分为两组,a和b 在差别的组划分举行异或就 ok了。

  • 若何分组?
num1: 101110    110     1111
num2: 111110    001     1001
mask: 010000    001     0010

在异或效果中任选一位 1 ,对原数据举行与操作,就能将两个只泛起一次的数分到差别数组。

class Solution:
    def singleNumbers(self, nums: List[int]) -> List[int]:
        if nums is None:
            return []
        xor = 0
        for num in nums:
            xor ^= num #两个只泛起一次数的异或效果

        mask = 1	
        while (mask&xor)==0:
            mask <<= 1	#选择一位 1 作为mask 举行划分
        
        a,b = 0,0
        for num in nums:
            if (num & mask)==0:	#划分
                a ^= num
            else:
                b ^= num

        return a,b
,

Sunbet 申博

Sunbet 申博www.cdbxlplvs.com Sunbet是Sunbet的官方网站。Sunbt官网有你喜欢的Sunbet、申博APP下载、Sunbet最新网址、Sunbet管理网最新网址等。

上一篇:allbet电脑版下载:辽篮杀入总决赛已经超越自我 抱着学习态度挑战九冠王

下一篇:申傅会员注册:各种饮料保健功效

网友评论

  • 2020-08-12 00:01:18

    欧博网址开户欢迎进入欧博网址(Allbet Gaming),欧博网址开放会员注册、代理开户、电脑客户端下载、苹果安卓下载等业务。夜里独自看,巴适