LeetCode 268. Missing Number 题解 与 异或运算

本文介绍了一种寻找数组中缺失数字的有效算法。该算法通过使用位的异或运算避免了传统求和方法可能导致的整数溢出问题。文章详细解释了异或运算的基本原理,并通过实例演示了如何应用该算法解决特定问题。

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

268 . Missing Number

题意:

已知一个包含n个整数的数组,包含数列0, 1, 2, …, n(有n+1个数)里面的n个数,要求求出数组与数列相比缺少的那个数。
实现以下函数:

class Solution {
public:
    int missingNumber(vector<int>& nums) { 

    }
};

题解:

首先,我们会想到最简单直接的方法,就是把数组中的数全都加起来,然后计算0一直加到n的和,用数列的和减去数组的和,即可得到缺少的那个数。
代码实现如下:

class Solution {
public:
    int missingNumber(vector<int>& nums) {
        int sum = 0;
        int n = nums.size();
        vector<int>::iterator it;
        for(it=nums.begin();it!=nums.end();it++)
        {
            sum += *it;
        }
        return (1+n)*n/2 - sum;
    }//缺点:int sum可能会爆掉。 
};

然而,当我们提交之后,会发现,当n过大时,和sum爆掉了。

不得已,去看discuss的最佳解。
最佳解用到了位的异或运算,十分巧妙。

首先,我们先来基本了解一下位的异或运算。

参与运算的两个值,如果两个相应位相同,则结果为0,否则为1。即:
0^0=0, 1^0=1, 0^1=1, 1^1=0

0^0=0,0^1=1 可以看出,0异或任何数=任何数
1^0=1,1^1=0 可以看出 1异或任何数=任何数取反
任何数异或自己=把自己置0

数a两次异或同一个数b(a=a^b^b)仍然为原值a.

接着,我们便可以尝试用异或运算来解这一道题了。

首先,代码如下:

class Solution {
public:
    int missingNumber(vector<int>& nums) { //利用xor异或运算 ,可避免int爆掉 
    int res = nums.size();
    for(int i=0; i<nums.size(); i++){
        res ^= i;
        res ^= nums[i];
    }
    return res;
    }
};

举个例子,比如,我们得到一个数组[0,1,2,4,5],则res==5,在每一次for循环中,我们让5分别和i、nums[i]做异或运算,在5次循环后,res会和数列[0,1,2,3,4]和数组[0,1,2,4,5]都异或一遍,因为一个数a两次异或同一个数b(a=a^b^b)仍然为原值a,所以,初始值5在多次异或运算后,得到的结果就是只与5异或一次的数字,也就是缺的哪一个数字。

这种方法运用了位运算,计算十分快。

内容概要:本文介绍了奕斯伟科技集团基于RISC-V架构开发的EAM2011芯片及其应用研究。EAM2011是一款高性能实时控制芯片,支持160MHz主频和AI算法,符合汽车电子AEC-Q100 Grade 2和ASIL-B安全标准。文章详细描述了芯片的关键特性、配套软件开发套件(SDK)和集成开发环境(IDE),以及基于该芯片的ESWINEBP3901开发板的硬件资源和接口配置。文中提供了详细的代码示例,涵盖时钟配置、GPIO控制、ADC采样、CAN通信、PWM输出及RTOS任务创建等功能实现。此外,还介绍了硬件申领流程、技术资料获取渠道及开发建议,帮助开发者高效启动基于EAM2011芯片的开发工作。 适合人群:具备嵌入式系统开发经验的研发人员,特别是对RISC-V架构感兴趣的工程师和技术爱好者。 使用场景及目标:①了解EAM2011芯片的特性和应用场景,如智能汽车、智能家居和工业控制;②掌握基于EAM2011芯片的开发板和芯片的硬件资源和接口配置;③学习如何实现基本的外设驱动,如GPIO、ADC、CAN、PWM等;④通过RTOS任务创建示例,理解多任务处理和实时系统的实现。 其他说明:开发者可以根据实际需求扩展这些基础功能。建议优先掌握《EAM2011参考手册》中的关键外设寄存器配置方法,这对底层驱动开发至关重要。同时,注意硬件申领的时效性和替代方案,确保开发工作的顺利进行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值