面试题 17.04. 消失的数字

LeetCode题解

消失的数字

题目描述:
在这里插入图片描述
➡️ 挑战链接 ⬅️
分析:

方法一:
题目给了我们一个很重要的条件,一群[0,n]的所有整数,只少了一个;
那么完整的数据是不是就是:0,1,2,3,4,5,6,……,n
现在缺了一个,那么我们是不是可以利用原来完整的数据总和减去现在数组的总和是不是就是缺的那个数呢?
而刚好完整的数组是从0到n的等差数列,我们就可以利用等差数列求和公式将完整的数据之和求出来,然后在遍历一遍现在的数组就可以得到缺失的数组之和;
代码实现:

int missingNumber(int* nums, int numsSize){
          int oldSum=(numsSize+1)*numsSize/2;//求完整数据之和
          for(int i=0;i<numsSize;i++)
          {
              oldSum-=nums[i];//求缺失数组之和
          }
          return oldSum;
}

时间复杂度:O(N)
空间复杂度:O(1)
在这里插入图片描述

方法二:
首先还是题目给定的[0,n]区间下手,我们不是缺一个嘛,我们现在将完整的数组开辟出来,先全部初始化为-1,然后再从元素组将数据一个一个拷贝下来,放进完整的数组里面,当然我们不能乱发,每个元素都有自己对应的位置,不要乱放,比如缺失数组里面的3,就应该放在完整数组下标为3的位置;依次类推~
最后我们在遍历一遍完整的数组,如果我们发现了元素值等于-1,那么就可以直接返回改下标值,该下标值就是缺失的数字:
画图演示:
在这里插入图片描述

时间复杂度:O(N)
空间复杂度:O(1)

代码实现:

int missingNumber(int* nums, int numsSize){
             int len=numsSize+1;
             int tmp[len];
             memset(tmp,-1,sizeof(tmp));
             for(int i=0;i<numsSize;i++)
             tmp[nums[i]]=nums[i];
             int j=0;
             for(j=0;j<len;j++)
             if(tmp[j]<0)
             break;
             return j;
}

在这里插入图片描述
方法三:
由于只是缺失一个数字,那么我们可以把原数据和现在的数据放在一起吧:
比:
例子中的:
3,0,1
原数据:0,1,2,3
现在: 3,0,1
我们把连个数组合起来是不是会发现只有2出现了一次,其它数据都出现了2次,那么我们是不是可以考虑利用异或的性质来解决;

异或性质:
a^a=0;
0^a=a;
a^ b ^ c=a ^ c ^ b

同样的道理,我们只需要对这合并起来的数据进行不断异或,最终全部异或完毕异或出来的数据就是缺失的那个数据了;
代码实现:

int missingNumber(int* nums, int numsSize){
            int x=0;
            for(int i=0;i<=numsSize;i++)
            x^=i;
            for(int i=0;i<numsSize;i++)
            x^=nums[i];
            return x;
}

时间复杂度:O(N)
空间复杂度:O(1)

在这里插入图片描述

  • 24
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 18
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

南猿北者

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

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

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

打赏作者

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

抵扣说明:

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

余额充值