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

《算法闯关指南:优选算法--位运算》--38.消失的两个数字
在这里插入图片描述

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


🎬 博主简介:

在这里插入图片描述

文章目录


前言:

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

38. 消失的两个数字

题目链接

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

题目描述

q

题目示例

在这里插入图片描述

解法(位运算):

算法思路:

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

C++算法代码:

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

classSolution{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 中比特位不同的那⼀位

classSolution{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};}};

算法总结&&笔记展示:

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

在这里插入图片描述


在这里插入图片描述

结语:

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

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

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

Read more

【算法一周目】数据深处的舞者:二分查找的优雅与力量

【算法一周目】数据深处的舞者:二分查找的优雅与力量

文章目录 * 1.二分查找 * 2.在排序数组中查找元素的第一个和最后一个位置 * 3.搜索插入位置 * 4. x 的平方根 * 5.山峰数组的峰顶 * 6.寻找峰值 * 7.搜索旋转排序数组中的最小值 * 8.0~n-1 中缺失的数字 1.二分查找 题目链接:704. 二分查找 题目描述: 给定一个升序排列的整数数组 nums,和一个目标值 target。如果 target 在数组中存在,返回其下标;否则,返回 -1。 示例 1: * 输入:nums = [-1,0,3,5,9,12], target = 9 * 输出:

By Ne0inhk
蓝桥杯C++组算法知识点整理 · 考前突击(上)【小白适用】

蓝桥杯C++组算法知识点整理 · 考前突击(上)【小白适用】

【背景说明】本文的作者是一名算法竞赛小白,在第一次参加蓝桥杯之前希望整理一下自己会了哪些算法,于是有了本文的诞生。分享在这里也希望与众多学子共勉。如果时间允许的话,这一系列会分为上中下三部分和大家见面,祝大家竞赛顺利! 【文风说明】本文主要会用代码+注释的方式来解释内容。相信学过编程的人都会发现程序比长篇大论更易理解! 目录 一、语言基础 1.1 编程基础 1.2 竞赛常用库函数 1.2.1 sort 函数 1.2.2 最值查找 1.2.3 二分查找 1.2.4 大小写转换 1.2.5 全排列 1.2.6 其它库函数整理 1.3 STL的用法 1.

By Ne0inhk
【数据结构手札】顺序表实战指南(五):查找 | 任意位置增删

【数据结构手札】顺序表实战指南(五):查找 | 任意位置增删

🌈个人主页:聆风吟 🔥系列专栏:数据结构手札 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 * 📚专栏订阅推荐 * 📋前言 - 顺序表文章合集 * 一. ⛳️顺序表:重点回顾 * 1.1 🔔顺序表的定义 * 1.2 🔔顺序表的分类 * 1.2.1 👻静态顺序表 * 1.2.2 👻动态顺序表 * 二. ⛳️顺序表的基本操作实现 * 2.1 🔔查找某个值的下标 * 2.2 🔔在下标为pos位置插入x * 2.3 🔔删除下标为pos位置的数据 * 三. ⛳️顺序表的源代码 * 3.1 🔔SeqList.h 顺序表的函数声明 * 3.2 🔔SeqList.c

By Ne0inhk
《数据结构风云》:二叉树遍历的底层思维>递归与迭代的双重视角

《数据结构风云》:二叉树遍历的底层思维>递归与迭代的双重视角

🔥@晨非辰Tong: 个人主页 👀专栏:《C语言》、《数据结构与算法入门指南》 💪学习阶段:C语言、数据结构与算法初学者 ⏳“人理解迭代,神理解递归。” 文章目录 * 引言 * 知识点前瞻 * 一、不一样的前序遍历 * 1.`要求描述:` * 2.`实现示例:` * 3.`算法思路:` * 3.1 `具体代码实现` * 3.2 **==注意要点==** * 二、不一样的中序遍历 * 1.`要求描述:` * 2.`实现示例` * 3.`算法思路:` * 3.1 `具体代码实现:` * 三、不一样的后序遍历 * 1.`要求描述:` * 2.`实现示例:` * 3.`算法思路:` * 3.1 `具体代码实现:` * 四、

By Ne0inhk