【算法 | 位运算No.1】leetcode268. 丢失的数字

个人主页:兜里有颗棉花糖

欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创

收录于专栏【手撕算法系列专栏】【Leetcode

🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望对大家有所帮助

🍓希望我们一起努力、成长,共同进步。

点击直接跳转到该题目

目录

1️⃣题目描述

给定一个包含 [0, n]n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。

示例1:

输入:nums = 3,0,1

输出:2

解释:n = 3,因为有 3 个数字,所以所有的数字都在范围 0,3 内。2 是丢失的数字,因为它没有出现在 nums 中。

示例2:

输入:nums = 0,1

输出:2

解释:n = 2,因为有 2 个数字,所以所有的数字都在范围 0,2 内。2 是丢失的数字,因为它没有出现在 nums 中。

示例3:

输入:nums = 0,1

输出:2

解释:n = 2,因为有 2 个数字,所以所有的数字都在范围 0,2 内。2 是丢失的数字,因为它没有出现在 nums 中。

示例4:

输入:nums = 0

输出:1

解释:n = 1,因为有 1 个数字,所以所有的数字都在范围 0,1 内。1 是丢失的数字,因为它没有出现在 nums 中。

注意:

  • n == nums.length
  • 1 <= n <= 104
  • 0 <= nums[i] <= n
  • nums 中的所有数字都 独一无二

2️⃣题目解析

总共有三种解法(哈希、位运算、高斯求和)。

这里只对位运算高斯求和进行解释。

位运算求解原理:

  • 相同数组进行异或结果为0
  • 0 ^ num = num

高斯求和原理:

  • 0,n的和记为sum1
  • 把数组nums中所有的元素之和记为sum2
  • 丢失的数字即为sum1 - sum2

3️⃣解题代码

解法1(高斯求和):

cpp 复制代码
class Solution {
public:
    int missingNumber(vector<int>& nums) {
        int n = nums.size(),sum1 = 0,sum2 = 0;

        for(int i = 0;i < n;i++) sum1 += nums[i];
        for(int i = 0;i <= n;i++) sum2 += i;

        return sum2 - sum1;   
    }
};

解法2(位运算):

cpp 复制代码
class Solution {
public:
    int missingNumber(vector<int>& nums) {
        int n = nums.size(),ret = 0;
        for(auto x : nums) ret ^= x;
        for(int i = 0;i <= n;i++) ret ^= i;
        return ret;
    }
};
相关推荐
用户938515635074 小时前
从 O(n²) 到 O(nlogn):一文读懂快速排序的“快”与“妙”
javascript·算法
To_OC5 小时前
手写快排次次翻车?别死背快排模板了,这才是面试官想听的底层逻辑
javascript·算法·排序算法
饼干哥哥6 小时前
Reddit VOC调研太慢?搭一个AI专家团队半小时洞察任何品类|以猫用饮水机为例
人工智能·算法·ai编程
地平线开发者7 小时前
Transformer模型部署之性能优化指南
算法
地平线开发者7 小时前
人在途中:从“编译失败”到“模型可落地”——CUDA 自定义算子
算法·自动驾驶
半个落月10 小时前
从递归到快速排序:用 JavaScript 把分治思想讲明白
javascript·算法·面试
小月土星11 小时前
JavaScript 快速排序:从 pivot、双指针到分治思想
javascript·算法·面试
小月土星11 小时前
JavaScript 递归入门:从 1 到 n 求和,再到数组扁平化
javascript·算法·面试
To_OC1 天前
LC 1 两数之和:面试第一道必考题,暴力解法直接被面试官 pass
javascript·算法·leetcode