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

题目

该题目取自力扣(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]。

消失的数字(c语言多种解法)_第1张图片

消失的数字(c语言多种解法)_第2张图片

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

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

消失的数字(c语言多种解法)_第4张图片

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

给一个值X等于0,X先跟0到N的所有值异或,x在和数组中的每一个值异或,最后的X就是缺的那个数。两数异或值为0消失的数字(c语言多种解法)_第5张图片

源码

//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;
//}

你可能感兴趣的:(c语言,算法,开发语言,经验分享,笔记)