消失的数字

这篇博客探讨了如何在O(N)的时间复杂度内找到一个包含0到n所有整数但缺失一个的数组中的缺失数字。两种方法被提出:一是通过计算所有数字之和与数组元素之和的差值;二是利用异或操作的性质,两次异或相同数字结果为0,最终得到的结果即为缺失的数字。这种方法展示了数学和位操作在算法设计中的巧妙应用。
摘要由CSDN通过智能技术生成

复杂度要求O(N)

数组nums包含从0n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗?

方法一:

1.把从0到n的所有整数加在一起结果是sum1
2.把数组中的所有元素相加在一起结果是sum2
3.最后用sum1 - sum2其结果就是缺失的那个数字

方法二:

1.异或:异或是相同是0,不同为1。两个相同的数异或得零,任何数与0异或0^n = n。

2.先将0 - N个数进行异或得到一个ret,然后再将ret与所给数组中的每个数字进行异或,最后所得的数字就是我们所求的数字。

int missingNumber(int* nums, int numsSize)
{
    int i = 0;
    int ret = 0;
    //5 3 1 2 0
    //把数组中的元素全部异或在一起,存到ret中
    //全部异或,就是5^3^1^2^0,当然0不用考虑
    for (i = 0; i < numsSize; i++)
    {
        ret ^= nums[i];
    }
    //5^3^1^2^5^4^3^2^1^0 = 4,因为相同的数字异或得到0,而0与任何数异或是其本身
    //用ret异或从0到n的所有整数
    for (i = 0; i <= numsSize; i++)
    {
        ret ^= i;
    }
    return ret;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值