数组中找出两个只出现一次的数字

在给定的整型数组中,除了两个数字仅出现一次外,其他数字都出现了两次。利用异或操作的性质,可以在O(n)的时间复杂度和O(1)的空间复杂度下找出这两个数字。首先对所有数进行异或,得到的异或结果是两个目标数字的异或。接着,根据异或结果中某一位为1的情况,将数组划分为两部分,分别对两部分再进行异或,即可得到两个只出现一次的数字。
摘要由CSDN通过智能技术生成

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

思路:题目要求时间复杂度是O(n),空间复杂度是O(1),这说明基于比较的办法求解无法完成,这题需要异或的性质,异或(同为0,异为1,相当于不进位加法)

因为其它数都出现两次,当扫描完一次之后,将所有的数做异或,那些相同的数都会变成0,结果是两个不同的数的异或。例如,9,4,4,2做异或,4,4异或为0,结果就相当于9异或2。

这里有两个数字不同,假设只有一个数字不同,那么,我们只需要扫描一遍,所有数做异或就可以得出结果。有两个数字怎么办呢?思路就是将这两个数划分到两个不同的组去。

划分依据是什么呢?

1,可以这么做,先将所有的数异或起来,假设结果为11001100,那么可以用最低的1位划分(即第2位,低到高,从0数起)[实质上可以用任何一个1划分,只是这是最方便的],为什么1可以划分开两个不同的数呢?将两个数写成二进制的形式,那么异或结果显示出的1位(同时两个不同的数相异或必然有1,因为同则必为0),都是二者相应位不同的。(异为1,同为0),因此用1划分则不同的两数必然被分到两个不同组

2,第二步,将两个子数组的数做异或就能得出结果,因为相同的数会得0.

3,小技巧,中途需要判断位是否为1,方法是:先将要判断的位通过右移移到最末位,然后与0000.....00001

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Raise

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值