消失的数字(c语言多种解法)

本文讨论了如何在LeetCode的17.04.消失的数字题目中找到数组中缺失的整数,提供了三种方法:第一种是简单相加法(O(n)时间,O(1)空间),第二种是动态数组比较法(O(n)时间,O(n)空间),第三种是异或操作法(O(n)时间,O(1)空间)。
摘要由CSDN通过智能技术生成

题目

该题目取自力扣(LeetCode)面试题 17.04. 消失的数字

该题目主要考察时间复杂度的把握,题目如下:

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

示例 1:

输入:[3,0,1]

输出:2

示例 2:

输入:[9,6,4,2,3,5,7,0,1]

输出:8

最后所以的源码放在最后

思路一(时间复杂度O(N),空间复杂度O(1))

也是最简单的一种思路,就是把一到N个数全部相加再减去一到N用数组表示的数,我也觉得这个方法是最优解,因为他的思想也不难。用1+2+3....+n去减去arr[0]+arr[1]...+arr[n-1]。

思路二(时间复杂度O(N),空间复杂度O(N))

这个方法我认为也是最难理解的一种方法,首先先创造一个动态数组,然后把动态数租对比元数组要多一个数,再把-1全部放入这个动态数组中,然后对比之前的那个数组把那个数组的数放置在动态数组中下标所对应的数中去,然后最后那个下标为-1的值,那就是要找的那个数字。就好比如果有五个萝卜,我挖六个坑全部填进去之后看哪个坑上没有萝卜,那就是我要找的那个坑。

思路三(时间复杂度O(N),空间复杂度O(1))

给一个值X等于0,X先跟0到N的所有值异或,x在和数组中的每一个值异或,最后的X就是缺的那个数。两数异或值为0

源码

//int missingNumber(int* nums, int numsSize)
//{
//    int tmp = 0;
//    int x = 0;
//    for (int i = 0; i <= numsSize; i++)
//    {
//        tmp += i;
//
//    }
//    for (int j = 0; j <= numsSize - 1; j++)
//    {
//
//        x += nums[j];
//    }
//    return tmp - x;
  

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

 

//int missingNumber(int* nums, int numsSize)
//{
//    int* temp = (int*)malloc(sizeof(int) * (numsSize + 1));
//    if (temp == NULL) 
//    {
//        printf("%s\n,strerror(errno)");
//        return 0;
//    }
//    int i = 0;
//    for (i = 0; i < numsSize + 1; i++)
//    {
//        *(temp + i) = -1;
//    }
//    for (i = 0; i < numsSize; i++)
//    {
//        temp[*nums] = *nums;
//        nums++;
//    }
//    for (i = 0; i < numsSize + 1; i++)
//        if (*(temp + i) == -1)
//        {
//            free(temp);
//            temp == NULL;
//            return i;
//        }
//    }
//    return 0;
//}

  • 43
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

LaNzikinh篮子

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

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

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

打赏作者

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

抵扣说明:

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

余额充值