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

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

题目如下:

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

注意:本题相对书上原题稍作改动

示例 1:

输入:[3,0,1]

输出:2
 

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

输出:8

---------------------------------------------------------------------------------------------------------------------------------

思路一:冒泡排序

先将数组中的数据按照顺序排列,再用其余数据比对,若不等于就为消失的数字

时间复杂度超过O(N),冒泡排序的复杂度为O(N^2),所以在oj上是没法跑的


int missingNumber(int* nums, int numsSize)
{
    //排序
    for(size_t i =0;i<numsSize;i++)
    {
        for(size_t j =1;j<numsSize;j++)
        {
            if(nums[j-1]>nums[j])
            {
                int tmp = 0;
                tmp = nums[j-1];
                nums[j-1] = nums[j];
                nums[j] = tmp;
            }
        }
    }
    //比对
    for(size_t i = 0;i<numsSize;i++)
    {
        if(nums[i]!= i)
        {
            printf("%zd",i);
            break;
        }
    }
}

 思路2:

异或求和,利用异或的特点,找出消失的数字

时间复杂度O(N)


int missingNumber(int* nums, int numsSize)
{
    //异或原数组数据
    int x = 0;
    for(size_t i = 0;i<numsSize;i++)
    {
        x ^= nums[i];
    }
    //再与顺序数字异或
    for(size_t i =0;i<=numsSize;i++)
    {
        x ^= i;
    }
   return x;
}

思路3:

求和,先求出原数组的和,再减去顺序数列,即可得到消失的数字

时间复杂度O(N)

int missingNumber(int* nums, int numsSize)
{
    size_t sum = 0;
    //求和
    for(size_t i = 1;i<=numsSize;i++)
    {
        sum += i;
    } 
    //减去原数组数据
    for(size_t i=0;i<numsSize;i++)
    {
        sum-=nums[i];
    }

    return sum;
}

当然你也可以用公式求和

int missingNumber(int* nums, int numsSize)
{

    //求和,一共有numsSize+1项
    size_t sum = (numsSize*(numsSize+1))/2;
    //减去原数组数据
    for(size_t i=0;i<numsSize;i++)
    {
        sum-=nums[i];
    }

    return sum;
}

思路4:

空间换时间,仍然创建一个新的空间,将对应的数字一个个放进去,进行比对,如果不对则那个数字就是消失的数字。

时间复杂度O(N)

int missingNumber(int* nums, int numsSize)
{
    int *a=malloc(sizeof(a)*(numsSize+1));

    for (size_t i = 0; i < numsSize; i++)
    {
        a[nums[i]] = nums[i];
    }

    for (size_t i = 0; i < numsSize+1; i++)
    {
        if (a[i] != i)
        {
            return i;
        }
    }

    free(a);
    a = NULL;
    return -1;
}

 return -1 是为了过gcc编译器。

写博客不易,感谢观看,如有看法不同可在评论区评论。各位观众老爷,点个赞吧

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值