• 面试题 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;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    时间复杂度: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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这里插入图片描述
    方法三:
    由于只是缺失一个数字,那么我们可以把原数据和现在的数据放在一起吧:
    比:
    例子中的:
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

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

    在这里插入图片描述

  • 相关阅读:
    Softing连接解决方案——将FANUC数控机床数据集成到西门子工业边缘
    Jenkins 构建时动态获取参数
    DDD进阶_领域设计的分层架构
    ps智能填充功能平替:alpaca的安装和使用
    J2L3x:如何用强大撤回消息功能提高工作效率?
    vue3+ts+vite搭建项目
    NVM安装vue相关
    DNS用的是TCP协议还是UDP协议
    有了这个网站,妈妈再也不用担心我找不到好看的配图了!
    想记录一下基于Arduino的从入门到提升的开发这一系列的记录。
  • 原文地址:https://blog.csdn.net/qq_62106937/article/details/127593720