《算法题讲解指南:优选算法-位运算》--35.两个整数之和,36.只出现一次的数字 ||,37.消失的两个数字

《算法题讲解指南:优选算法-位运算》--35.两个整数之和,36.只出现一次的数字 ||,37.消失的两个数字

🔥小叶-duck个人主页

❄️个人专栏《Data-Structure-Learning》

《C++入门到进阶&自我学习过程记录》《算法题讲解指南》--从优选到贪心

未择之路,不须回头
已择之路,纵是荆棘遍野,亦作花海遨游


目录

35.两个整数之和

题目链接:

题目描述:

题目示例:

解法(位运算):

算法思路:

C++算法代码:

算法总结及流程解析:

36.只出现一次的数字 ||

题目链接:

题目描述:

题目示例:

解法(比特位计数):

算法思路:

C++算法代码:

算法总结及流程解析:

38. 消失的两个数字

题目链接:

题目描述:

题目示例:

解法(位运算):

算法思路:

C++算法代码:

算法总结及流程解析:

结束语


35.两个整数之和

题目链接:

371. 两整数之和 - 力扣(LeetCode)

题目描述:

题目示例:

解法(位运算):

算法思路:
  • 异或 ^ 运算本质是【无进位加法
  • 按位与 & 操作能够得到【进位】的对应位置,但还需要左移1才是需要进位的位置
  • 然后一直循环,直到【进位】变成 0 为止

C++算法代码:

class Solution { public: int getSum(int a, int b) { //解法:位运算(^异或:无进位相加) while(b) { int x = a ^ b; int y = (a & b) << 1; a = x; b = y;//得到进位的对应位置,再左移1才是需要进位的位置 //只进行一次a & b不一定保证新的a和b没有需要进位的位置,所以需要将这个步骤进行循环 //a & b为0则说明没有进位的位置了 } return a ^ b; } };

算法总结及流程解析:

36.只出现一次的数字 ||

题目链接:

137. 只出现一次的数字 II - 力扣(LeetCode)

题目描述:

题目示例:

解法(比特位计数):

算法思路:

      设要找的数为 ret。
      由于整个数组中,需要找的元素只出现了【一次】,其余的数都出现【三次】,因此我们可以用根据所有数的【某一个比特位】的总和 %3 的结果快速定位到 ret 上的【一个比特位上】的值  是 0 还是 1
      这样我们通过 ret 的每一个比特位上的值,就可以将 ret 还原出来。

C++算法代码:

class Solution { public: int singleNumber(vector<int>& nums) { //方法一:排序(时间复杂度较大:O(NlogN),但容易想到) // sort(nums.begin(), nums.end()); // for(int i = 0; i < nums.size() - 1; i += 3) // { // if(nums[i] != nums[i + 1]) // { // return nums[i]; // } // } // return nums.back(); //方法二:位运算(为线性时间复杂度:O(32N),但非常巧妙比较难想) int ret = 0;//作为位图 for(int i = 0; i < 32; i++) //一个数二进制位的长度,依次修改ret的每一位 { int sum = 0; for(int x = 0; x < nums.size(); x++) //计算nums中所有数的二进制第i位的和 { sum += ((nums[x] >> i) & 1); } ret |= ((sum % 3) << i); //求和结果余3后修改到ret对应第i位的位置 } return ret; } };

算法总结及流程解析:

38. 消失的两个数字

题目链接:

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

题目描述:

题目示例:

解法(位运算):

算法思路:

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

C++算法代码:

class Solution { public: vector<int> missingTwo(vector<int>& nums) { //位运算 //先将数组nums所有数以及1~N+2区间所有数全部异或一遍,得到消失两数的异或 int ret = 0; int a = 0; int b = 0; //分别表示两个消失的数 for(int i = 0; i < nums.size(); i++) { ret ^= nums[i]; } for(int i = 1; i <= nums.size() + 2; i++) { ret ^= i; } //此时ret = a ^ b //由于a和b一定不同,所以一定会存在某一位比特位一个是0一个是1 ////两者异或后对应的那一位就一定是1,所以我们需要找到那一位 //获取到ret最右侧出现1的比特位位置 int x = 0; while(1) { if(((ret >> x) & 1) == 1) { break; } x++; } //将数组nums所有数以及(1~N+2)区间所有数分成两类: //一类就是第x位比特位值为0,一类就是第x位比特位值为1 ////这样两个消失数就会被分开,通过异或,在数组以及(1~N+2)区间都出现的数就会抵消, //a和b也就分别是这两个消失数了 for(int i = 0; i < nums.size(); i++) { if(((nums[i] >> x) & 1) == 0)//假设a是第x位比特位为0的消失数 { a ^= nums[i]; } else //假设b就是第x位比特位为1的消失数 { b ^= nums[i]; } } for(int i = 1; i <= nums.size() + 2; i++) { if(((i >> x) & 1) == 0) { a ^= i; } else { b ^= i; } }//两次循环则数组中存在的数异或了两次被抵消,a和b就分别是两个消失数 return {a, b}; } };

算法总结及流程解析:

结束语

      到此,35.两个整数之和,36.只出现一次的数字 ||,37.消失的两个数字 这三道算法题就讲解完了。第35题通过异或和按位与操作实现无进位加法,循环处理进位直至为零,高效求解两数之和;第36题利用比特位计数技术,统计所有数字各二进制位出现次数,模3结果定位唯一出现一次的数字;第37题通过位运算巧妙解决。首先将数组与[1,n+2]区间所有数异或,转化为两个数出现一次的问题。核心思路借鉴了260题《只出现一次的数字III》,通过提取不同比特位将数分组异或,最终找到缺失的两个数。希望大家能有所收获!

Read more

2026 前端 / 后端 / 算法岗 AI 技能清单,直接对标大厂

2026 前端 / 后端 / 算法岗 AI 技能清单,直接对标大厂

2026 大厂前端岗 AI 技能清单 核心基础技能 * 大模型前端适配能力:掌握大模型上下文管理,实现对话历史的高效存储与加载,适配流式输出的前端渲染逻辑。 * AI 组件开发:熟练开发基于大模型的智能组件,如代码补全、智能问答、内容生成类组件,支持参数化配置与多模型切换。 * 向量数据库集成:掌握 Pinecone、Weaviate 等向量数据库的前端调用方法,实现语义搜索、相似内容推荐等功能。 进阶实践技能 * 大模型微调适配:理解大模型微调原理,能够基于前端业务场景,将微调后的模型部署至前端环境,实现模型轻量化调用。 * 多模态交互开发:支持文本、图像、音频等多模态输入的前端处理,对接多模态大模型 API 实现智能交互。 * AI 性能优化:实现大模型请求的批量处理、缓存复用与增量更新,降低前端请求延迟与资源消耗。 实战代码示例 以下为基于 OpenAI API 实现的流式对话前端组件,使用 React 18 开发:

By Ne0inhk
《算法闯关指南:优选算法--前缀和》--29.和为k的子数组,30.和可被k整除的子数组

《算法闯关指南:优选算法--前缀和》--29.和为k的子数组,30.和可被k整除的子数组

🔥草莓熊Lotso:个人主页 ❄️个人专栏: 《C++知识分享》《Linux 入门到实践:零基础也能懂》 ✨生活是默默的坚持,毅力是永久的享受! 🎬 博主简介: 文章目录 * 前言: * 29. 和为k的子数组 * 解法(前缀和+哈希表): * 算法思路: * C++算法代码: * 算法总结&&笔记展示: * 30. 和可被k整除的子数组 * 解法(前缀和+哈希表): * 前置知识补充: * 算法思路: * C++算法代码: * 算法总结&&笔记展示: * 结尾: 前言: 聚焦算法题实战,系统讲解三大核心板块:优选算法:剖析动态规划、二分法等高效策略,学会寻找“最优解”。 递归与回溯:掌握问题分解与状态回退,攻克组合、

By Ne0inhk
数据结构-单链表

数据结构-单链表

单链表 * 概念与结构 * 结点 * 链表的性质 * 链表的打印 * 实现单链表 * 头文件 * 源文件 * 单链表的打印 * 单链表申请新节点内存 * 尾插 * 头插 * 尾删 * 头删 * 查找 * 在指定位置之前插入数据 * 在指定位置之后插入数据 * 删除pos结点 * 删除pos之后的结点 * 销毁链表 * 链表的分类 * 代码地址 概念与结构 概念:链表是⼀种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 逻辑结构:线性 物理结构(存储结构):不一定是线性的 链表就类似一个火车,车头是哨兵位(可有可无),车厢是节点 * 将火车里的某节车厢去掉或加上,不会影响其他车厢,每节车厢都是独立存在的。 在链表⾥,每节“车厢”是什么样的呢? \color{red}{在链表⾥,每节“车厢”是什么样的呢?

By Ne0inhk
通俗易懂->哈希表详解

通俗易懂->哈希表详解

目录 一、什么是哈希表? 1.1哈希表长什么样? 1.2为什么会有哈希表? 1.3哈希表的特点 1.3.1 取余法、线性探测 1.3.2 映射 1.3.3负载因子 1.4哈希桶 1.5闲散列与开散列 1.6总结 二、设计hash表 1、哈希表的设计   1)插入   2)查找  3)删除 4)字符串哈希算法 2、封装map和set 1、完成对hash表的基础功能 2、完成封装 3、对应的迭代器 4、【】方括号重载 三、

By Ne0inhk