zoukankan      html  css  js  c++  java
  • 面试题56

    面试题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
    
  • 相关阅读:
    超市帐单系统
    JavaOOP
    拦截器的工作原理是什么?
    struts2
    500错误
    idea添加struts框架后报错
    2019春第九周作业
    2019春第八周作业
    2019春第七周作业
    2019春第六周作业
  • 原文地址:https://www.cnblogs.com/gongyanzh/p/12797077.html
Copyright © 2011-2022 走看看