消失的数字(C语言)

面试题 17.04. 消失的数字

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

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

输入:[3, 0, 1] 输出:2

示例 2:

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

解题思路

🌟思路一:

排序,但是时间复杂度不满足,因为最快的排序,其时间复杂度也达不到题目的要求。

🌟思路二:

1.把从0到n的所有整数加在一起结果是sum1 2.把数组中的所有元素相加在一起结果是sum2 3.最后用sum1-sum2其结果就是缺失的那个数字

🌟 思路三:

异或(^):相同为0,相异为1(指的是二进制位)。 1 .把数组中的元素全部异或在一起 : tmp= nums[0] ^ nums[1] ^ … ^ nums[numsSize-1] 2.用tmp异或从0到n的所有整数,其结果就是缺失的那个数字

代码实现

思路一:读者有兴趣可自己实现。

思路二:

int missingNumber(int* nums, int numsSize)
{
          
   
    int i = 0;
    int sum1 = 0;
    int sum2 = 0;
    //把从0到n的所有整数累加到sum1
    for (i = 0; i <= numsSize; i++)
    {
          
   
       sum1 += i;
    }
    //把数组中的所有元素累加在到sum2
    for (i = 0; i < numsSize; i++)
    {
          
   
       sum2 += nums[i];
    }
    return sum1 - sum2;
}

思路三:

int missingNumber(int* nums, int numsSize)
{
          
   
    int i = 0;
    int tmp = 0;
    //把数组中的元素全部异或在一起,存到tmp中
    for (i = 0; i < numsSize; i++)
    {
          
   
       tmp ^= nums[i];
    }
    //用tmp异或从0到n的所有整数
   for (i = 0; i <= numsSize; i++)
   {
          
   
       tmp ^= i;
   }
    return tmp;
}

最后本题就能很好的提交过去了。

经验分享 程序员 微信小程序 职场和发展