【位运算】消失的两个数字

文章目录

  • 面试题 17.19. 消失的两个数字
  • 解题思路

在这里插入图片描述

面试题 17.19. 消失的两个数字

面试题 17.19. 消失的两个数字

​ 给定一个数组,包含从 1 到 N 所有的整数,但其中缺了两个数字。你能在 O(N) 时间内只用 O(1) 的空间找到它们吗?

​ 以任意顺序返回这两个数字均可。

示例 1:

输入: [1]
输出: [2,3]

示例 2:

输入: [2,3]
输出: [1,4]

提示:

  • nums.length <= 30000

解题思路

​ 这道题其实就是 268. 丢失的数字137. 只出现一次的数字 II 的一个组和题,只要这两道题会了,然后稍微变化一下就变成了这道题!无非就是这道题出现一次的数字是两个,而我们得像 268. 丢失的数字 这道题一样去遍历所有的整数两次,换在 137. 只出现一次的数字 II 这道题上无非就是其它数字出现了两次!

​ 也就是说,这道题转化为了:一个数组中从 [1, n] 的数字只有两个数字出现了一次,而其它数字出现了两次!这个转化很关键!

  1. 首先,我们用一个变量 n,去遍历【异或上】 nums 数组中的每一个元素,然后再去遍历【异或上】 [1, nums.size() + 2] 区间内所有的数字,最后显而易见,那些出现了两次的数字,在两次的遍历之后都被抵消了,所以最后得到的 n 就是两个只出现一次的元素的异或体,假设这两个出现一次的元素分别是 ab,那么 n = a ^ b
  2. 接着,我们考虑一个性质:因为 ab 一定是不同的,所以 n 的比特位中一定会存在某些位为 1(因为异或之后,相异的比特位得到的就是 1),而这些比特位对于 ab 来说,不是 a = 1b = 0,就是 a = 0b = 1,那么我们只需要根据找到 n 中比特位为 1 的其中一个位置 pos(代码中我们是找最右侧的那个),然后再到 nums 数组中遍历一遍,根据每个数字的 pos 处比特位的值进行划分,这里规定 pos 处比特位为 1 的划分存在 a 的集合 seta 中,而为 0 的划分在存在 b 的集合 setb 中,最后得到的就是一个不含有 a 的异或集合,一个不含有 b 的异或集合
  3. 此时 问题就转化为了分别求 setasetb 中在 [0, nums.size() + 2] 上消失的那个数字,那不就很简单了吗,我们只需要让 setasetb (此时这两个集合存放的是 nums 中出现一次的数字)分别去遍历一次 [1, nums.size() + 2] 上所有数字,最后出现一次的那些数字因为遍历第二遍后都被抵消了,而那个消失的数字就会在最后的异或结果被得到,两个集合都是如此!

​ 解析有点绕,建议画图跟着分析,代码如下所示:

class Solution {
public:vector<int> missingTwo(vector<int>& nums) {// 1. 假设丢失的是a和b,那么先异或上全部元素,得到的结果就是a^bint n = 0;for(int i = 0; i < nums.size(); ++i)n ^= nums[i];for(int i = 1; i <= nums.size() + 2; ++i)n ^= i;// 2. 找到a和b比特位中为1的其中一个位置(a和b是不同的,所以一定存在这个比特位为1)int pos = 0;while(true){if((n >> pos) & 1)break;pos++;}// 3. 根据这个相异的比特位就能划分成两个集合seta和setbint seta = 0, setb = 0;for(int i = 0; i < nums.size(); ++i){if((nums[i] >> pos) & 1)seta ^= nums[i];elsesetb ^= nums[i];}// 4. 此时就是分别在seta和setb中找只存在一次的数,也就是a和b,那么只需要再遍历异或一遍所有整数即可for(int i = 1; i <= nums.size() + 2; ++i){if((i >> pos) & 1)seta ^= i;elsesetb ^= i;}return { seta, setb };}
};

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/75756.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自然语言处理Hugging Face Transformers

Hugging Face Transformers 是一个基于 PyTorch 和 TensorFlow 的开源库&#xff0c;专注于 最先进的自然语言处理&#xff08;NLP&#xff09;模型&#xff0c;如 BERT、GPT、RoBERTa、T5 等。它提供了 预训练模型、微调工具和推理 API&#xff0c;广泛应用于文本分类、机器翻…

vue开发基础流程 (后20)

创建项目命令&#xff1b; 或者 vue create my - vue - router - project这个是创建带路由的项目 22.组件组成 比如说一个页面吧&#xff0c;他三个组件&#xff0c;template就是用来放所有的标签&#xff0c;script用来放业务逻辑&#xff0c;style用来放样式&#xff0c;c…

高性能内存kv数据库Redis

引言 在当今数据驱动的时代&#xff0c;高效的数据存储和检索对于各类应用程序至关重要。Redis&#xff08;Remote Dictionary Server&#xff09;作为一款开源的内存键值数据库&#xff0c;凭借其出色的性能、丰富的数据结构和灵活的特性&#xff0c;在众多场景中得到了广泛应…

自动化测试概念篇

文章目录 目录1. 自动化1.1 自动化概念1.1.1 回归测试 1.2 自动化分类1.3 自动化测试金字塔 2. web自动化测试2.1 驱动2.1.1 安装驱动管理2.1.2 selenium库 3. Selenium3.1 一个简单的web自动化示例3.2 selenium驱动浏览器的工作原理 目录 自动化web自动化测试Selenium 1. 自…

《AI大模型应知应会100篇》第17篇:大模型的偏见与公平性问题

第17篇&#xff1a;大模型的偏见与公平性问题 摘要 在人工智能迅速发展的今天&#xff0c;大型语言模型&#xff08;LLM&#xff09;已经深入到我们的日常生活和工作中。然而&#xff0c;这些模型并非完美无缺&#xff0c;它们可能携带并放大数据中的偏见&#xff0c;导致不公…

【踩坑】GitHub Actions 运行的 Linux 环境中,文件名是大小写敏感的

在使用 VuePress 搭建个人博客并部署到 GitHub Pages 的过程中&#xff0c;我遇到了一个颇为棘手的问题&#xff1a;本地打包一切正常&#xff0c;但在 GitHub Actions 自动执行打包流程时&#xff0c;却提示找不到 README.md 文件&#xff0c;导致整个流程失败。经过一番深入排…

C# 13新特性 - .NET 9

转载&#xff1a; C# 13 中的新增功能 | Microsoft Learn C# 13 包括以下新增功能。 可以使用最新的 Visual Studio 2022 版本或 .NET 9 SDK 尝试这些功能&#xff1a;Introduced in Visual Studio 2022 Version 17.12 and newer when using C# 13 C# 13 中的新增功能 | Micr…

numpy.ma.masked_where:屏蔽满足条件的数组

1.函数功能 屏蔽满足条件的数组内容&#xff0c;返回值为掩码数组 2.语法结构 np.ma.masked_where(condition, a, copyTrue)3. 参数 参数含义condition屏蔽条件a要操作的数组copy布尔值&#xff0c;取值为True时&#xff0c;结果复制数组(原始数据不变)&#xff0c;否则返回…

【Redis】数据结构和内部编码

先来复习一下之前学过的几个基本的全局命令&#xff1a; keys&#xff1a;用来查看匹配规则的keyexists&#xff1a;用来判定执行key是否存在del&#xff1a;删除指定的keyexpire&#xff1a;给key设置过期时间ttl&#xff1a;查询key的过期时间type&#xff1a;查询key对应的…

OBOO鸥柏如何以智能教育室内外触摸屏一体机AI变革硬件

在AI技术蓬勃发展的当下&#xff0c;OBOO鸥柏室外触摸屏一体机通过融入AI科技&#xff0c;为教育领域带来了翻天覆地的变化。这款一体机不仅为高校和大学校园提供了革命性的数字化教学解决方案&#xff0c;更引领了引体向上成绩提升一体机带训室外终端屏幕设备的新潮流。其创新…

从零搭建高并发体育直播网站:架构设计、核心技术与性能优化实战

本文从技术视角拆解体育直播网站开发全流程&#xff0c;涵盖高并发架构设计、低延迟视频流传输、实时弹幕系统实现等核心模块&#xff0c;并附可复用的代码片段与优化方案。适合中高级开发者进阶实战参考。 一、需求分析与技术选型 1. 典型业务场景 核心需求&#xff1a;支持1…

【Python内置函数的深度解析与应用】id

目录 前言&#xff1a;技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解关键技术模块技术选型对比 二、实战演示环境配置要求核心代码实现1. 基础身份验证2. 不可变对象优化3. 对象生命周期追踪 运行结果验证 三、性能对比测试方法论量化数据…

3.vtkProp 和vtkProp3D

文章目录 vtkProp 和vtkProp3D使用vtkProp3D使用vtkPro vtkProp 和vtkProp3D vtkProp 和 vtkProp3D 都是VTK&#xff08;Visualization Toolkit&#xff09;库中的类&#xff0c;它们用于在渲染场景中表示可视化元素。理解这两个类的区别和用途对于有效地使用VTK进行三维数据可…

【ZYNQ Linux移植】2-获取设备树

0 写在前面 这是一个系列博客&#xff0c;详细介绍如何在 ZYNQ 与 ZYNQ MP 平台上如何移植 Linux 系统。目前网络上的大部分教程都是全程基于 Petalinux 的开发&#xff0c;虽然这样简化了开发流程&#xff0c;但对于初学者深入理解掌握 Linux 是不利的&#xff0c;所以&#x…

基础算法篇(5)(蓝桥杯常考点)—动态规划(C/C++)

文章目录 动态规划前言线性dp路径类dp经典线性dp背包问题分类01背包问题完全背包问题多重背包分组背包问题混合背包问题多维费用的背包问题区间dp 动态规划 前言 在竞赛中&#xff0c;如果遇到动态规划的题目&#xff0c;只要不是经典题型&#xff0c;那么大概率就是以压轴题的…

obsidian写文章的图床设置方法

目标 要达成的需求&#xff1a; 复制到obsidian的图片&#xff0c;自动上传到Picgo配置的图床。可以自定义大小。可以一键下载当前文章的图片到本地。 obsidian配置图床 安装并配置插件 image auto upload plugin&#xff0c;配置信息如下图。 滚轮alt自定义大小 安装并…

QPaintDevice绘图设备

1.QPixmap 对不同平台做了显示的优化&#xff0c;可以将画的图保存到磁盘上 头文件&#xff1a; #include"QPixmap" #include"QPainter" 1.1QPixmap画图 代码&#xff1a; //Pixmap绘图设备QPixmap pix(300,300);//声明画家QPainter painter(&pix…

数据结构有哪些类型(对于数据结构的简述)

在学习计算机时&#xff0c;数据结构是不可忽视的一点&#xff0c;从考研时的408课程&#xff0c;再到工作中编写软件&#xff0c;网站&#xff0c;要想在计算机领域站住脚跟&#xff0c;数据结构是必备的 在这里&#xff0c;我对于数据结构进行了汇总&#xff0c;并简要描述&…

L2TP实验(无图后补)

拓扑图 一、搭建拓扑并配置基础 IP 地址 设备选型与拓扑搭建&#xff1a;在 eNSP 中&#xff0c;拖入所需设备&#xff0c;包括 LAC&#xff08;L2TP Access Concentrator&#xff0c;L2TP 接入集中器 &#xff09;、LNS&#xff08;L2TP Network Server&#xff0c;L2TP 网络服…

【C#】CAN通信的使用

在C#中实现CAN通信通常需要借助第三方库或硬件设备的驱动程序&#xff0c;因为C#本身并没有直接内置支持CAN通信的功能。以下是一个关于如何使用C#实现CAN通信的基本指南&#xff0c;包括所需的步骤和常用工具。 1. 硬件准备 要进行CAN通信&#xff0c;首先需要一个支持CAN协…