初识算法 · 位运算(end)

目录

前言:

题目解析

算法原理

算法编写


前言:

本文作为初识算法 · 位运算的最后一篇文章,使用一道hard题目来结束这个专题,题目的链接为:

面试题 17.19. 消失的两个数字 - 力扣(LeetCode)

还是和前文一样,通过三个部分介绍,题目解析,算法原理,算法编写来介绍。

那么话不多说,进入主题吧!


题目解析

题目的要求十分简单,是让我们在一段连续数字区间里面找到缺失两个数字,数字的区间是从1到N的。要求非常简单。

所以我们直接进入到算法原理部分。

算法原理

这道题目其实是丢失的数字和只出现一次的数字III的结合,链接为:

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

260. 只出现一次的数字 III - 力扣(LeetCode)

结合两道题目的描述,我们就直到就是这两个结合起来嘛,所以使用异或运算律,将数集分为两组是肯定的,可是这里一共只有一段区间,我们去哪里找呢?简单,我们自己创一个区间不就行了吗?

因为这道题目可以分析为,在一堆数字里面,只有两个数字出现了一次,其他数字出现了两次。

所以使用异或,将其他数字全部干掉的同时,使用异或运算,将数分组,所以a和在某个比特位上同组的数字异或,b同理,最后的结果就是我们的答案。

这道题可以使用ret & -ret,也可以直接while找,都是可以的。

算法编写

cpp 复制代码
class Solution 
{
public:
    vector<int> missingTwo(vector<int>& nums) 
    {
        //两堆数字异或
        int tmp = 0;
        for(auto e : nums) tmp ^= e;
        for(int i = 0;i <= nums.size() + 2; i++) tmp ^= i;
        //找出不同
        int diff = 0;
        while(1)
        {
            if(((tmp >> diff) & 1) == 1) break;
            else diff++;
        }
        //开始分组
        int a = 0, b = 0;
        for(int x : nums)
            if(((x >> diff) & 1) == 1) a ^= x;
            else b ^= x;
        for(int i = 0; i <= nums.size() + 2; i++)
            if(((i >> diff) & 1) == 1) a ^= i;
            else b ^= i;

        return { a, b };
    }
};

感谢阅读!

相关推荐
小O的算法实验室21 小时前
2026年ASOC,基于深度强化学习的无人机三维复杂环境分层自适应导航规划方法,深度解析+性能实测
算法·无人机·论文复现·智能算法·智能算法改进
风止何安啊1 天前
为什么要有 TypeScript?让 JS 告别 “薛定谔的 Bug”
前端·javascript·面试
郭涤生1 天前
STL vector 扩容机制与自定义内存分配器设计分析
c++·算法
༾冬瓜大侠༿1 天前
vector
c语言·开发语言·数据结构·c++·算法
Ricky111zzz1 天前
leetcode学python记录1
python·算法·leetcode·职场和发展
汀、人工智能1 天前
[特殊字符] 第58课:两个正序数组的中位数
数据结构·算法·数据库架构··数据流·两个正序数组的中位数
liu****1 天前
第16届省赛蓝桥杯大赛C/C++大学B组(京津冀)
开发语言·数据结构·c++·算法·蓝桥杯
汀、人工智能1 天前
[特殊字符] 第79课:分割等和子集
数据结构·算法·数据库架构·位运算·哈希表·分割等和子集
汀、人工智能1 天前
[特殊字符] 第74课:完全平方数
数据结构·算法·数据库架构·图论·bfs·完全平方数
CoderCodingNo1 天前
【GESP】C++四、五级练习题 luogu-P1177 【模板】排序
数据结构·c++·算法