数组中数字出现的次数

这篇博客介绍了如何在时间复杂度为O(n)和空间复杂度为O(1)的情况下,找到一个整型数组中仅出现一次的两个数字。通过数组元素的异或操作,可以将这两个数字分开并逐一求解。以示例数组{4, 1, 4, 6}为例,详细解释了异或操作的过程和思路,并提供了代码实现。" 123178100,11828201,MODBUS RTU串口调试实战:PCM开发板与串口助手交互,"['单片机', '物联网', 'MODBUS', '串口通信']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数组中数字出现的次数

题目描述:一个整型数组里除了两个数字之外,其他数字都出现两次。
要求:时间复杂度为O(n),空间复杂度为O(1)

思路:数组中只有两个出现次数为一次的数,其余数都是两两出现,本题可以通过有异或来进行求解;首先可以将数组里面的数进行一次异或,得到的结果是两个只出现一次的数的异或值;第二步,找出异或后二进制位的第一个位为1的位,然后将数组中的值进行划分,这样会将这两个出现一次的数分别划分在不同的数组中;第三步,分别对两个数组进行异或,便可求得数组中两个出现次数位一次的数字。

举例说明:
{4,1,4,6}
4:0100
1:0001
4:0100
6:1100
可以知道:4 ^ 4 = 0(异或,相同位,相同为0,相异为1)
所以数组异或结果为 1101
可以发现1和6可以通过二进制位第一个为1的位划分开
第一个 数组:0001(1)
第二个数组:0100 0100 1100(4,4,6)
分别异或就得到0001和1100,就是结果1,6

代码实现

vector<int> singleNumbers(vector<int>& nums) {
        int len = nums.size();
        vector<int> ret(2,0);//用于对最终的异或结果进行保存
      
        
        int temp = 0; // 用于对nums数组进行一遍异或运算
        for(int i=0;i<len;i++)
        {
            temp = temp^nums[i];
        }
        // 寻找temp二进制第一个为1的位置
        int pos = 0; //pos记录右移的位数个数
        while((temp&1)!=1)
        {
            pos++;
            temp = temp>>1;
        }
        //根据该pos位置将nums分为两部分,直接进行位运算
        for(int i=0;i<len;i++)
        {
            if((nums[i]>>pos)& 1 == 1)//找到所有数种二进制位第一次出现一的数,进行异或
            {
                ret[0] = ret[0]^nums[i];
            }
            else 
                ret[1] = ret[1]^nums[i];
        }
        return ret;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值