【位運算】消失的兩個數字

文章目錄

  • 面試題 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.pswp.cn/web/75756.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/75756.shtml
英文地址,請注明出處:http://en.pswp.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協…