《算法题讲解指南:优选算法-位运算》--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

Linux系统学习【深入剖析Git的原理和使用(上)】

Linux系统学习【深入剖析Git的原理和使用(上)】

🔥承渊政道:个人主页 ❄️个人专栏: 《C语言基础语法知识》《数据结构与算法》 《C++知识内容》《Linux系统知识》 ✨逆境不吐心中苦,顺境不忘来时路!🎬 博主简介: 引言:在软件开发的全流程中,版本控制是保障协作效率、规避开发风险的核心基石,而Git作为目前最流行、最强大的分布式版本控制系统,早已渗透到从个人开发到大型企业级项目的每一个环节.无论是多人协作时的代码冲突解决、开发过程中的版本回溯,还是跨环境的代码同步、分支管理,Git都以其高效、安全、灵活的特性,成为开发者必备的核心工具.然而,多数开发者对Git的使用仍停留在“会用基础命令”的层面——知道用git add提交暂存、git commit提交本地、git push推送远程,却未必理解这些命令背后的底层逻辑:暂存区(Stage)、本地仓库(Local Repository)、远程仓库(Remote Repository)之间的数据流是怎样的?Git如何高效追踪文件的每一次变更?分布式架构与SVN等集中式版本控制系统相比,核心优势到底体现在哪里? 基于此,

By Ne0inhk

GitHub汉化插件完整指南:打造个性化中文开发环境

GitHub汉化插件完整指南:打造个性化中文开发环境 【免费下载链接】github-chineseGitHub 汉化插件,GitHub 中文化界面。 (GitHub Translation To Chinese) 项目地址: https://gitcode.com/gh_mirrors/gi/github-chinese 还在为GitHub的英文界面感到困扰吗?GitHub汉化插件能够将整个平台界面完美转换为中文环境,让技术学习和项目管理变得更加轻松自然。这款开源工具不仅支持完整的界面中文化,还提供亮色与暗色主题的完美适配,为你打造个性化的开发体验。 🚀 快速上手安装步骤 第一步:安装脚本管理器 这是运行汉化插件的基础环境,推荐选择: * Tampermonkey:功能丰富,社区活跃 * Violentmonkey:开源轻量,隐私友好 安装方法: 1. 打开浏览器应用商店 2. 搜索对应名称并点击安装 3. 确认工具栏出现相应图标 安全提示:务必从官方渠道下载,避免使用第三方来源的安装包。 第二步:获取汉化脚本 有两种方式可以获取最新的汉化脚本:

By Ne0inhk

图表数据提取神器:WebPlotDigitizer 快速上手全攻略

图表数据提取神器:WebPlotDigitizer 快速上手全攻略 【免费下载链接】WebPlotDigitizerComputer vision assisted tool to extract numerical data from plot images. 项目地址: https://gitcode.com/gh_mirrors/web/WebPlotDigitizer 还在为从图表图片中提取数据而烦恼吗?WebPlotDigitizer 这款计算机视觉辅助工具能够帮你快速从各种图表图像中提取精确的数值数据。无论你是科研人员需要从论文图表获取实验数据,还是工程师要从技术报告提取趋势曲线,这个工具都能在几分钟内完成数据转换。 新手必备:快速搭建你的数据提取环境 在开始使用之前,你需要确保系统环境准备就绪。首先检查 Node.js 版本,建议使用 v14 或更高版本: node -v npm -v 如果未安装,Ubuntu 用户可以通过以下命令快速安装: sudo apt update

By Ne0inhk

Qwen3.5 开源全解析:从 0.8B 到 397B,代际升级 + 全场景选型指南

摘要 2026 年除夕夜,阿里通义千问正式发布Qwen3.5 开源模型家族,从 0.8B 端侧小模型到 397B 旗舰 MoE 模型全覆盖。本文深度对比 Qwen3.5 与前代 Qwen3 的核心升级,拆解全参数版本差异、优势与落地场景,帮开发者快速选型、高效部署。 前言 大模型行业早已告别 “参数内卷”,转向效率、多模态、低成本落地。Qwen3.5 不是简单的版本迭代,而是通义千问在架构、训练、推理、生态上的代际突破,全面开源(Apache 2.0 协议),让个人开发者、中小企业都能用最低成本跑起最强性能。 一、Qwen3.5 vs Qwen3:四大核心升级

By Ne0inhk