当前位置: 首页 > news >正文

【算法】位运算算法——消失的两个数字(困难)

题解:消失的两个数字(位运算算法)

目录

  • 1.题目
  • 2.题解
  • 3.示例代码如下
  • 4.总结

1.题目

题目链接:LINK
在这里插入图片描述

2.题解

本题要求时间复杂度O(N),空间复杂度O(1),分别否了我们 排序遍历哈希数组 的想法。想要在规定时间/空间复杂度内完成本题,需要借用 位运算算法

具体该如何操作呢?
①首先,我们将 原数组 与 [1,n+2] 的数字全部 异或起来,这时候会得出 ret = a ^ b
②根据ret,我们可以知道 a 与 b 的不同的一位二进制,我们根据这位不同的二进制来区分a 和 b
③让 原数组[1,n+2] 数字根据不同的这一二进制位 站队,再把两队全部异或起来消去相同的一项得出a 和 b,因为a 和 b只在[1,n+2]中出现过一次因而不会被异或掉。

可能单纯叙述有点抽象,我直接用一个例子来说明我上面说的步骤:


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


3.示例代码如下

class Solution {
public:vector<int> missingTwo(vector<int>& nums) {int ret = 0;for(auto& num : nums) ret ^= num;for(int i = 1; i <= nums.size()+2; i++) ret ^= i; //ret = a ^ bint count = 0;while(1){if(((ret >> count) & 1) == 1) break;else count++;}int a = 0;int b = 0;for(auto& num: nums) {if(((num >> count) & 1) == 1) a ^= num;else b^=num;}for(int i = 0; i <= nums.size()+2; i++){if(((i >> count) & 1) == 1) a ^= i;else b^=i;}return {a,b};}
};

4.总结

这道题整体的思路是这样的,我们先找出ret = a ^ b来,主要是为了确定这俩数字哪个二进制位不一样,方便将其归纳到不同的组中去,两个消失的数字归纳到不同的组之后我们可以用异或的两两相消原理,把重复的数字全部干掉,一组只剩下a,一组只剩下b,返回即可。

拓展:位运算常用操作:LINK


EOF

相关文章:

  • FinalShell无法连接Linux
  • 【论文导读】Grid Graph Reduction for Efficient Shortest Pathfinding(2023 Access)
  • 64位和32位对C++ 对long类型的使用造成程序崩溃、内存泄漏问题。
  • 鸿蒙ArkTS声明式开发:跨平台支持列表【显隐控制】 通用属性
  • 【Python爬虫--scrapy+selenium框架】超详细的Python爬虫scrapy+selenium框架学习笔记(保姆级别的,非常详细)
  • HTTPS 原理技术
  • 专科生听劝 这种情况你就不要专转本了
  • 【QT】qcombox的信号使用小细节,activated(int)和currentIndexChanged(int)
  • 数据分析案例-在线食品订单数据可视化分析与建模分类
  • 【YashanDB知识库】自动选举配置错误引发的一系列问题
  • java实现地形dem产汇流流场数据提取解析
  • 《少年小鱼的魔法之旅——神奇的Python》,在悬疑和冒险中学会Python编程,Python启蒙入门的推荐书籍
  • 组合数计算方法(递推公式、乘法逆元)
  • MFC工控项目实例之二添加iPlotx控件
  • MySQL基础索引知识【索引创建删除 | MyISAM InnoDB引擎原理认识】
  • C++入门教程(10):for 语句
  • isset在php5.6-和php7.0+的一些差异
  • javascript面向对象之创建对象
  • JavaScript新鲜事·第5期
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • python docx文档转html页面
  • scrapy学习之路4(itemloder的使用)
  • SQLServer之创建显式事务
  • vue-loader 源码解析系列之 selector
  • windows下mongoDB的环境配置
  • 复习Javascript专题(四):js中的深浅拷贝
  • 关于 Cirru Editor 存储格式
  • 你真的知道 == 和 equals 的区别吗?
  • 扑朔迷离的属性和特性【彻底弄清】
  • -- 数据结构 顺序表 --Java
  • 用element的upload组件实现多图片上传和压缩
  • 原生 js 实现移动端 Touch 滑动反弹
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • raise 与 raise ... from 的区别
  • 大数据全解:定义、价值及挑战
  • ​​​【收录 Hello 算法】9.4 小结
  • (C++17) std算法之执行策略 execution
  • (SpringBoot)第七章:SpringBoot日志文件
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (十三)MipMap
  • *Django中的Ajax 纯js的书写样式1
  • .bat批处理(六):替换字符串中匹配的子串
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .net SqlSugarHelper
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .NET 药厂业务系统 CPU爆高分析
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .NetCore实践篇:分布式监控Zipkin持久化之殇
  • .net的socket示例
  • .Net多线程总结
  • .sh
  • .vue文件怎么使用_我在项目中是这样配置Vue的
  • @AliasFor注解