《算法闯关指南:优选算法--位运算》--38.消失的两个数字


🔥草莓熊Lotso: 个人主页
❄️个人专栏: 《C++知识分享》 《Linux 入门到实践:零基础也能懂》
✨生活是默默的坚持,毅力是永久的享受!


🎬 博主简介:


文章目录


前言:

聚焦算法题实战,系统讲解三大核心板块:优选算法:剖析动态规划、二分法等高效策略,学会寻找"最优解"。 递归与回溯:掌握问题分解与状态回退,攻克组合、排列等难题。 贪心算法:理解"局部最优"到"全局最优"的思路,解决区间调度等问题 内容以题带点,讲解思路与代码实现,帮助大家快速提升代码能力。


38. 消失的两个数字

题目链接

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

题目描述

题目示例

解法(位运算):

算法思路:

本题就是 268.丢失的数字+260.只出现一次的数字||| 组合起来的题。

先将数组中的数和【1,n+2】区间内的所有数【异或】在一起,问题就变成了:有两个数出现了【一次】,其余所有的数出现了【两次】。进而变成了 260.只出现了一次的数字||| 这道题。

C++算法代码:

代码一:使用了提取最右边的1

cpp 复制代码
class Solution {
public:
    vector<int> missingTwo(vector<int>& nums) {
        int temp=0;
        for(auto& x:nums)
            temp^=x;
        for(int i=1;i<=nums.size()+2;i++)
            temp^=i;
        
        //现在temp中剩下的是a^b,那么一定至少有一位是1,我们就提取最后一位
        int ls=temp&(-temp);
        int a=0,b=0;
        for(auto&x:nums)
        {
            if(x&ls) a^=x;
            else b^=x;
        }

        for(int i=1;i<=nums.size()+2;i++)
        {
            if(i&ls) a^=i;
            else b^=i;
        }
        
        return {a,b};
    }
};

代码二:循环找出找出 a,b 中比特位不同的那⼀位

cpp 复制代码
class Solution {
public:
    vector<int> missingTwo(vector<int>& nums) {
        // 1. 将所有的数异或在⼀起
        int tmp = 0;
        for (auto x : nums) tmp ^= x;
        for (int i = 1; i <= nums.size() + 2; i++) tmp ^= i;

        // 2. 找出 a,b 中⽐特位不同的那⼀位
        int diff = 0;
        while (1) 
        {
            if (((tmp >> diff) & 1) == 1)
                break;
            else
                diff++;
        }

        // 3. 根据 diff 位的不同,将所有的数划分为两类来异或
        int a = 0, b = 0;
        for (int x : nums)
            if (((x >> diff) & 1) == 1) b ^= x;
            else a ^= x;
        for (int i = 1; i <= nums.size() + 2; i++)
            if (((i >> diff) & 1) == 1) b ^= i;
            else a ^= i;
        return {a, b};
    }
};

算法总结&&笔记展示:

笔记字有点丑,大家见谅:


结语:

html 复制代码
🍓 我是草莓熊 Lotso!若这篇技术干货帮你打通了学习中的卡点:
👀 【关注】跟我一起深耕技术领域,从基础到进阶,见证每一次成长
❤️ 【点赞】让优质内容被更多人看见,让知识传递更有力量
⭐ 【收藏】把核心知识点、实战技巧存好,需要时直接查、随时用
💬 【评论】分享你的经验或疑问(比如曾踩过的技术坑?),一起交流避坑
🗳️ 【投票】用你的选择助力社区内容方向,告诉大家哪个技术点最该重点拆解
技术之路难免有困惑,但同行的人会让前进更有方向~愿我们都能在自己专注的领域里,一步步靠近心中的技术目标!

结语:本文解析了LeetCode面试题17.19《消失的两个数字》,通过位运算巧妙解决。首先将数组与[1,n+2]区间所有数异或,转化为两个数出现一次的问题。核心思路借鉴了260题《只出现一次的数字III》,通过提取不同比特位将数分组异或,最终找到缺失的两个数。提供了两种C++实现代码:方法一直接提取最右1,方法二循环查找差异位。该解法高效且巧妙,适合面试算法准备。

✨把这些内容吃透超牛的!放松下吧✨ ʕ˘ᴥ˘ʔ づきらど

相关推荐
快乐zbc3 小时前
【C++ 基础】:给定一个指针 p,你能判断它是否指向合法的对象吗?
c++
青青草原技术员灰太狼3 小时前
Nginx的https搭建
linux·服务器·网络
sulikey3 小时前
C++类和对象(下):初始化列表、static、友元、内部类等核心特性详解
c++·static·初始化列表·友元·匿名对象·内部类·编译器优化
拿破轮4 小时前
使用通义灵码解决复杂正则表达式替换字符串的问题.
java·服务器·前端
oioihoii4 小时前
C++网络编程:从Socket混乱到优雅Reactor的蜕变之路
开发语言·网络·c++
程序员东岸4 小时前
《数据结构——排序(中)》选择与交换的艺术:从直接选择到堆排序的性能跃迁
数据结构·笔记·算法·leetcode·排序算法
程序员-King.4 小时前
day104—对向双指针—接雨水(LeetCode-42)
算法·贪心算法
笨鸟要努力4 小时前
Qt C++ windows 设置系统时间
c++·windows·qt
&&Citrus5 小时前
【杂谈】SNNU公共计算平台:深度学习服务器配置与远程开发指北
服务器·人工智能·vscode·深度学习·snnu
神仙别闹5 小时前
基于C++实现(控制台)应用递推法完成经典型算法的应用
开发语言·c++·算法