数组中只出现一次的数字系列问题

本文详细探讨了如何通过异或运算和其他方法找出数组中出现次数为1或者特定次数的数字。针对不同情况,如一个数字出现一次,其它出现两次;一个数字出现1次,其它出现N次;两个数字各出现一次;两个数字出现1次,其它出现N次;以及一个数字出现2次,其它出现1次,分别给出了有效的解决方案。涉及到的关键技术包括异或运算、位操作以及哈希统计。
摘要由CSDN通过智能技术生成

1.一个数字出现一次,其它数字出现两次:

        这是此类问题中最简单的。考虑到异或运算符^会把相同的位置为零,因此从第一个数字开始异或,最后得到的值就是出现一次的数字。

2.一个数字出现1次,其它数字出现N次:

        如果n为偶数就比较简单了,就和上述解法一样。但是当n为奇数时就不能用上述方法了,因为每个数会剩下一次。

        我们以其它数字出现3次为例。首先我们先不考虑这一个数,那么其它数字每一个二进制位出现的次数一定是3的整数倍。此时再加上出现一次的数,那么这个数在某一位如果是0,那么这一位的统计能被3整除,为1则不能。这样我们只需遍历数组记录每一位1出现的次数即可,如果该位出现的次数能被3整除则这个数在该位为0,反之为1。

        对于其它数字出现n次的情况也可以类比。

3.两个数字出现1次,其它数字出现2次:

        这时如果我们一起异或那么最后得到的会是这两个数字的异或结果,而且无法分解。那么如果能把这两个数字分开就好了。

        考虑到一样的数字每一位都相同,那么这两个数字异或至少有一位是1,我们找到一个异或结果为1的位(如果有多位为1挑选其中一个就行)。然后遍历数组,将该位是1的数字分到一组,剩下的分到另一组。然后每组进行全部元素的异或可以得到出现一次的数。

        判断某一位是否为1可以使用如下方式,假如一个数有八位,我们要判断其第3位是否为1,我们可以和0000 0100进行按位与,如果结果为0则该位是0,反之则是1。

4.两个数字出现1次,其它数字出现N次:

        还是以其它数字出现3次为例。

        1.先统计每一位1出现的次数,再查看被三整除的余数。挑选余数是1的一位,余数是1说明两个数一个在该位是1,另一个在该位是0。

        2.按上一步骤挑选的位置是0或1开始分组,0的为一组,1的为另一组。

        3.按照1个数字出现1次,其它数字出现3次的方式在这两组找结果。

5.一个数字出现2次,其它数字出现1次:

        这个题目看着与上述差不多,但是实际上无法使用异或的方式解决。目前来讲只能使用哈希来解决。如果是整数可以直接使用计数排序的方式,只不过这次我们只需要找到值为2的下标。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值