位运算---LC268丢失的数字

一、题目链接

268. 丢失的数字 - 力扣(LeetCode)

二、题目要求

给定一个包含 [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 = 9,6,4,2,3,5,7,0,1

**输出:**8

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

三、解决

1.解法一

暴力解法:数组是缺失0,n中的一个数,所以我们先将数组按顺序排好,然后遍历一遍数组就能找到缺失的那个数字了

时间复杂度不推荐。

cpp 复制代码
class Solution {
public:
    int missingNumber(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        for(int i = 0; i < nums.size(); i++)
        {
            if(nums[i] != i)
                return i;
        }
        return nums.size();
    }
};

2.解法二

哈希表:创建一个长度位n+1的数组,这个数组下标就是0,n,然后遍历原数组,遍历到哪个数就在哈希表的对应下标的值加一,然后再遍历哈希表,哈希表中的值为0的下标就是丢失的数字。

cpp 复制代码
class Solution {
public:
    int missingNumber(vector<int>& nums) {
        int n = nums.size();
        vector<int> arr(n+1,0);
        for(int i = 0; i < n; i++)
        {
            arr[nums[i]]++;
        }
        for(int i = 0; i < n+1; i++)
        {
            if(arr[i] == 0)
                return i;
        }
        return n;
    }
};

3.解法三

高斯求和:先求出0,n的和,再求出该数组中所有数字的和。用总和减去数组中的和,剩下的就是丢掉的数字。

cpp 复制代码
class Solution {
public:
    int missingNumber(vector<int>& nums) {
        int numsSum = 0;
        int Sum = 0;
        for(int i = 0; i < nums.size()+1; i++)
            Sum+=i;
        for(auto e : nums)
            numsSum+=e;
        return Sum-numsSum;
    }
};

4.解法四

位运算:由

①a ^ 0 = a

②a ^ a = 0

③a ^ b ^ c = a ^ (b ^ c)交换律

可以得出解决方法:

创建一个0,n的tmp数组,先将原数组中的数字全部异或在一起,然后再将tmp中的数字全部异或在一起,然后让两次异或的结果相互异或,最后就只剩下一个丢失的数字了。

cpp 复制代码
class Solution {
public:
    int missingNumber(vector<int>& nums) {
        int tmp1 = 0;
        int tmp2 = 0;
        for(int i = 0; i<nums.size()+1; i++)
            tmp1^=i;
        for(auto e:nums)
            tmp2^=e;

        return tmp1^=tmp2;
    }
};

总结:很简单的一道题,但是解法很多,可以帮助初学者入门,这几种方法最好全部掌握。

相关推荐
布莱克6052 小时前
C++ 中 map 的 insert 与 emplace:key 已存在时会覆盖吗?
开发语言·数据结构·c++·算法·map
D e re k ZH5 小时前
C++ 系统学习手记:从语法细节到工程实践
开发语言·数据结构·c++·算法
石小石Orz6 小时前
AI 正在蚕食我们的编码能力
前端·后端·算法
民乐团扒谱机7 小时前
【微实验】NSGA-II(非支配排序遗传算法)——解决多目标优化问题的“自然选择模拟器”
linux·人工智能·算法
青少儿编程课堂7 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:中缀表达式求值解析
c++·python·算法·bfs·信息学竞赛
文丑颜不良啊8 小时前
LeetCode2261~2280题目解析
java·leetcode
武子康9 小时前
Qwen-Drive 到底是什么:4B 级 VLM 如何成为驾驶策略底座
人工智能·算法·机器学习
zh_xuan11 小时前
LeeCode 496. 下一个更大元素I
数据结构·算法·栈·单调栈
机 _ 长11 小时前
05 智算运维|8 张卡怎么才算「捆成一张」:NCCL 实测与拓扑
运维·人工智能·算法·智算运维