欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

剑指offer - 找到数组中两个只出现一次的数

程序员文章站 2024-03-16 17:45:04
...

题目描述

一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。

思路

这个题我本来打算用暴力来解决的,弄一个dictionary,然后对每个数计数。

 

 

优化

空间复杂度为O(1)

用异或,相同数字的异或为0,0与任何数异或 为任何数。 

这样所有数异或的结果,为那两个只出现一次的数

然后根据这个异或结果,找出两个数 二进制位不同的一位(只要找一位就好)

根据这个二进制位分组,为0的在一组,为1的在一组。这样两个数字肯定被分到了不同组。而每一组里面的数字,只有一个只出现一次的数,其余数都出现两次.....不用说了,分别异或

class Solution:
    def FindNumsAppearOnce(self, array):
        if len(array)<2:
            return False
        num = array[0] ^ array[1]
        for i in range(2,len(array)):
            num ^= array[i]
        
        # 找到二进制位不同的一位,只需要找出来一位就行
        i = 1
        while num%2 == 0:
            num = int(num//2)
            i += 1
        
        # 按照上面找到的二进制位分组异或
        num1 = 0
        num2 = 0
        for num in array:
            if num%(2**i) == (2**(i-1)):
                num1 ^= num
            else:
                num2 ^= num
        return num1,num2
            
            

 

相关标签: leetcode