【LeetCode/面试题】消失的数字

在这里插入图片描述

个人主页:@Weraphael
✍作者简介:目前学习C++和算法
✈️专栏:Leetcode + 面试/笔试
希望大家多多支持,咱一起进步!
如果文章对你有帮助的话
欢迎 评论 点赞 收藏 加关注


目录

  • 一、题目描述
  • 二、思路及代码实现
      • 2.1 法一:数学公式法
      • 2.2 法二:按位异或

一、题目描述

链接:消失的数字

【LeetCode/面试题】消失的数字_第1张图片

二、思路及代码实现

2.1 法一:数学公式法

思路:可以先求出0~n所有整数的和,整数的和可以利用等差数列求和:Sn = n ( a 1 + a n ) 2 n(a_1 + a_n) \over 2 2n(a1+an),然后再分别让Sn减去数组内的元素,最后的结果就是消失的数字。对于时间复杂度,只遍历一次数组,所以时间复杂度为O(N)符合题目要求。

【代码实现】

int missingNumber(int* nums, int numsSize)
{
    //求出0~n的和
    int total_sum = numsSize * (numsSize + 1) / 2;
    for (int i = 0;i < numsSize;i++)
    {
        //用总和减去数组内的元素
        total_sum -= nums[i];
    }
    //最后的元素就是消失的数字
    return total_sum;
}

【LeetCode/面试题】消失的数字_第2张图片

代码解析
浅浅解释一下numsSize * (numsSize + 1) / 2。这里的numsSize指的是消失数字的元素个数,根据公式:Sn = n ( a 1 + a n ) 2 n(a_1 + a_n) \over 2 2n(a1+an),因为要求出没有消失数字的总和,所以总的元素个数为numsSize + 1,a1永远都是0,而最后的an恰好是消失元素个数的总和,也就是numsSize

2.2 法二:按位异或

这篇博客详细讲解了按位异或等操作符:操作符详解
这里简单总结一下按位异或操作符(^)

  • 计算规则:对应的二进制位相异为1,相同为0
  • a ^ a = 0 、0 ^ a = a、a ^ b = b ^ a

解题步骤如下(以示例一数据为例):
可以让原始数组的每一个元素分别与0~n异或即可找出消失的数据

  1. 那如何让原始数组的每一个元素分别与0~n异或呢?首先可以用0异或数组每一个元素,因为0 ^ 任何数 = 任何数。即0 ^ 3 ^ 0 ^ 1
  2. 再把第一步异或完数据分别再与0~n异或。即0 ^ 3 ^ 0 ^ 1 ^ 0 ^ 1 ^ 2 ^ 3
  3. 最后计算出的结果就是2,即消失的数字

【代码实现】

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

【LeetCode/面试题】消失的数字_第3张图片

你可能感兴趣的:(leetcode,算法,学习)