只出現一次的數字(總結)

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔

文章目錄

  • 前言
  • 一、給定一個整數數組nums,除了某個元素只出現一次以外,其余元素均出現兩次。找出那個只出現一次的元素
  • 二、給你一個整數數組nums,除某個元素僅出現一次外,其余每個元素都恰出現三次。請你找出并返回那個只出現了一次的元素
  • 三、一個整型數組nums里除了兩個數字之外,其他數字都出現了兩次,請找出這兩個只出現一次的數字。要求時間復雜度為O(n),空間復雜度是O(1)
  • 四、給定一個整數數組nums和一個整數k,除了某個元素僅出現一次外,其余每個元素都恰好出現了k次,請你找出并返回那個只出現了一次的元素


前言

我們在刷題的時候會碰到各種各樣的《只出現一次的數字》的題目,在這里,我們對碰到的題目進行總結

一、給定一個整數數組nums,除了某個元素只出現一次以外,其余元素均出現兩次。找出那個只出現一次的元素

異或的性質:

  • 0^x = x
  • x^x = 0; 同樣的數異或兩次得到零
  • 異或滿足交換律和結合律,不需要考慮順序

由于異或有以上的性質,所以我們可以將數組nums當中的元素依次進行異或操作,此時數組中出現兩次的數進行異或后變成了0,而最終異或得到的結果就是只出現一次的那個數

int* singleNumber(int* nums, int numsSize, int* returnSize)
{//找出這個值放到數組int* arr = (int*)malloc(sizeof(int)* 1);//輸出型參數,讓外面拿到數組的長度*returnSize =1 ;int ret = 0;for (int i = 0; i < numsSize; ++i){ret ^= nums[i];}arr[0] = ret;return arr;
}

二、給你一個整數數組nums,除某個元素僅出現一次外,其余每個元素都恰出現三次。請你找出并返回那個只出現了一次的元素

int類型變量的大小是4個字節,也就是32個比特位。由于相同的數的二進制序列都是一樣的,因此當我們遍歷nums數組當中的數字,依次同級每個比特位出現1的次數時,就會出現以下幾種情況:

  • 某一比特位出現1的次數為0,表明數組nums當中的所有數字的該比特位都為0,因此只出現一次的數字的該比特位也為0
  • 某一比特位出現1的次數對3取余后得到0值,表明數組nums中只出現一次的數字的該比特位為0
  • 某一比特位出現1的次數為3取余后得到非0值,表明數字nums中只出現一次的數字的該比特位為1

因此當我們遍歷nums數組統計得到每個比特位出現1的次數之后,就可以將這32個值依次對3進行求余操作,最終得到的32個0/1序列就是只出現一次的數字的二進制序列

#include <stdio.h>
#include <stdlib.h>
int singleNumber(int* nums, int numsSize) 
{int ret = 0; // 初始化結果為0// 遍歷整數的32個比特位for (int i = 0; i < 32; i++){int total = 0; // 用于統計當前比特位為1的元素個數// 遍歷數組中的所有元素for (int j = 0; j < numsSize; j++) {// 將當前元素右移i位,然后與1進行與操作// 這樣可以提取出第i個比特位的值(0或1)total += ((nums[j] >> i) & 1);}// 如果第i個比特位為1的元素個數不能被3整除// 則說明只出現一次的數字的這一比特位為1if (total % 3 != 0){// 使用位或操作將ret的第i個比特位設置為1ret |= (1 << i);}}return ret; // 返回只出現一次的數字
}// 示例使用
int main() {int nums[] = {2, 2, 3, 2}; // 示例數組,3是只出現一次的數字int size = sizeof(nums) / sizeof(nums[0]);int result = singleNumber(nums, size);printf("只出現一次的數字是: %d\n", result); // 應該輸出3return 0;
}

我們也可以使用排序后遍歷的方法,不過與位操作方法相比,位操作的時間復雜度為O(n),空間復雜度為O(1);排序后遍歷的方法其復雜度為O(nlongn),空間復雜度為O(1)或O(n),但是其實現簡單

使用數組排序后遍歷

#include <stdio.h>
#include <stdlib.h>// 比較函數,用于qsort
int compare(const void* a, const void* b) {return (*(int*)a - *(int*)b);
}int singleNumber(int* nums, int numsSize) {// 先對數組進行排序qsort(nums, numsSize, sizeof(int), compare);// 遍歷排序后的數組for (int i = 0; i < numsSize; i += 3) {// 如果當前元素與下一個元素不同,或者已經到達數組末尾if (i == numsSize - 1 || nums[i] != nums[i + 1]) {return nums[i];}}return -1; // 如果沒有找到,返回-1
}

三、一個整型數組nums里除了兩個數字之外,其他數字都出現了兩次,請找出這兩個只出現一次的數字。要求時間復雜度為O(n),空間復雜度是O(1)

數組nums當中除了出現一次的數字之外,剩下的都是出現兩次的數字,但是我們不能直接遍歷數組元素進行異或操作,因為此時nums數組當中有兩個出現一次的數字,如果我們直接將所有數字進行異或,最終得到的實際就是這兩個出現一次的數字相異或后的結果

如果我們可以將數組nums當中的數字分為兩組,并且這兩個出現一次的數字正好分別分到了兩組,此時就相當于分別在這兩個小組中找出現一次的數字,問題就回到了第一題

現在的問題就變成了,如何將這兩個只出現一次的數字分到兩個不同的組別中。
這個實際上很簡單,因為我們直接對數組nums當中的元素進行異或操作,得到的實際上就是這兩個只出現一次的數字相異或的結果,我們將結果稱為ret。由于這兩個只出現一次的數字的二進制序列是不同的,因此在ret的二進制序列當中一定至少存在一個不為0的比特位,而這兩個只出現一次的數字的該比特位的值是不同的,一個為0,一個為1
因此我們可以根據該比特位來進行分組,將數組nums當中該比特位為1的數字分為一組,將該比特位為0的數字分到另一組,則這兩個只出現一次的數字就一定被分到了兩個不同的組當中,其他出現兩次的數字,要么在這一組,要么在另一組

解題步驟如下:

  1. 遍歷數組nums,對數組中的所有元素進行異或,得到異或后的結果ret
  2. 找出ret當中任意一個不為0的比特位記為j
  3. 將原數組分為兩組,第j位為1的為a組,第j位為0的為b組
  4. x和y一定會分別進入a、b組,其他出現兩次的數,要么進入a組,要么進入b組
  5. a組和b組數據就變成其他數出現2次,只有一個數出現1次
  6. 再對a、b組進行異或就可以找出x和y

在這里插入圖片描述

int* singleNumber(int* nums, int numsSize, int* returnSize)
{   //1.計算所有元素的異或結果int ret = 0;for (int i = 0; i < numsSize; i++){ret ^= nums[i];}//2.找到ret中為1的任意一位(即x和y不同的位)int j = 0;while (((ret >> j) & 1) == 0){j++;}//3.根據第j位將數組分為兩組,并分別計算異或int x = 0, y = 0;for (int k = 0; k < numsSize; k++){if ((nums[k] >> j) & 1){x ^= nums[k];}else{y ^= nums[k];}}//4.準備返回值int* arr = (int*)malloc(sizeof(int)* 2);arr[0] = x;arr[1] = y;*returnSize = 2;return arr;
}

四、給定一個整數數組nums和一個整數k,除了某個元素僅出現一次外,其余每個元素都恰好出現了k次,請你找出并返回那個只出現了一次的元素

數組中除了那個只出現一次的數字之外,無論其他數字出現多少次,我們實際都可以通過統計每個比特位出現1的次數的方式進行求解
只不過現在我們是將得到的32個比特位各自出現1的次數對k進行求余操作,最終得到的32個0/1序列也就是出現一次的數字的二進制序列

#include <stdio.h>
#include <stdlib.h>
int singleNumber(int* nums, int numsSize,int k)
{int ret = 0; // 初始化結果為0// 遍歷整數的32個比特位for (int i = 0; i < 32; i++){int total = 0; // 用于統計當前比特位為1的元素個數// 遍歷數組中的所有元素for (int j = 0; j < numsSize; j++){// 將當前元素右移i位,然后與1進行與操作// 這樣可以提取出第i個比特位的值(0或1)total += ((nums[j] >> i) & 1);}// 如果第i個比特位為1的元素個數不能被k整除// 則說明只出現一次的數字的這一比特位為1if (total % k != 0){// 使用位或操作將ret的第i個比特位設置為1ret |= (1 << i);}}return ret; // 返回只出現一次的數字
}// 示例使用
int main() {int nums[] = { 2, 2, 3, 2 }; // 示例數組,3是只出現一次的數字int size = sizeof(nums) / sizeof(nums[0]);int k = 3;int result = singleNumber(nums, size,k);printf("只出現一次的數字是: %d\n", result); // 應該輸出3return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/920792.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/920792.shtml
英文地址,請注明出處:http://en.pswp.cn/news/920792.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Cesium 入門教程(十一):Camera相機功能展示

文章目錄一&#xff0c;Cesium 實際示例&#xff08;含源代碼&#xff09;1&#xff0c;vuecesium&#xff1a; 圍繞一個固定點自動左右旋轉2&#xff0c;vuecesium&#xff1a; flyto一個具體的實體位置3&#xff0c;vuecesium&#xff1a; flyto一個具體的點位置4&#xff0c…

go語言基本排序算法

package mainimport "fmt"func main() {BubbleSort()SelectSort()InsertSort()MergeSort()QuickSort()HeapSort()ShellSort() }//冒泡排序 func BubbleSort() {str : []int{9, 1, 5, 8, 3, 7, 4, 6, 2}for i : 0; i < len(str)-1; i {flag : falsefor j : len(str…

一步完成CalDAV賬戶同步,日歷服務助力釘釘日歷日程集中管理

在信息爆炸節奏飛快的今天&#xff0c;高效的管理時間已經成為我們工作和生活中的核心競爭力&#xff0c;復雜紛繁的日程安排&#xff0c;無處不在的提醒需求以及跨設備同步的困擾&#xff0c;這些問題仿佛都在呼喚著一個更智能、更便捷、更可靠的解決方案。 而華為日歷App&am…

企業內部機密視頻安全保護|如何防止企業內部機密視頻泄露?

在企業數字化進程飛速發展的今天&#xff0c;視頻內容已成為承載企業內部培訓、戰略會議、產品機密和核心技術的關鍵載體。一次意外的泄露&#xff0c;不僅可能導致知識產權流失&#xff0c;更會讓企業聲譽和市場競爭力遭受重創。面對無孔不入的安全威脅&#xff0c;企業該如何…

C# Deconstruct | 簡化元組與對象的數據提取

官方文檔&#xff1a;析構元組和其他類型 - C# | Microsoft Learn 標簽&#xff1a;Deconstruct、Tuple、record、模式匹配 PS&#xff1a;record相關內容后續還會繼續更新&#x1f504; 模式匹配可以查看我的另一篇&#x1f449;模式匹配 目錄1. 概述2. 基本用法2.1 元組解…

R 語言 ComplexUpset 包實戰:替代 Venn 圖的高級集合可視化方案

摘要 在生物信息學、數據挖掘等領域的集合分析中,傳統 Venn 圖在多維度數據展示時存在信息擁擠、可讀性差等問題。本文基于 R 語言的 ComplexUpset 包,以基因表達研究為場景,從包安裝、數據準備到可視化實現,完整演示如何制作正刊級別的集合交集圖,解決多條件下差異基因(…

?導游|基于SprinBoot+vue的在線預約導游系統

在線預約導游系統 基于SprinBootvue的在線預約導游系統 一、前言 二、系統設計 三、系統功能設計 前臺功能實現 后臺功能實現 管理員模塊實現 導游模塊實現 用戶模塊實現 四、數據庫設計 五、核心代碼 六、論文參考 七、最新計算機畢設選題推薦 八、源碼獲取&am…

SQL server 異常 出現錯誤 824

2025-08-27 01:36:37,324 ERROR c.z.i.w.DatabaseUtils [Scheduled-7] Error executeStoredProcedure SQL script: sp_RefreshDWDByDateFive警告: 在 08 27 2025 1:36AM 出現錯誤 824。請記錄該錯誤和時間&#xff0c;并與您的系統管理員聯系。 2025-08-27 01:36:37,332 ERROR …

制造業生產線連貫性動作識別系統開發

制造業生產線連貫性動作識別系統開發 第一部分&#xff1a;項目概述與理論基礎 1.1 項目背景與意義 在現代智能制造環境中&#xff0c;盡管自動化程度不斷提高&#xff0c;但人工操作仍然在復雜裝配任務中扮演著不可替代的角色。研究表明&#xff0c;人機協作被視為打破傳統人機…

什么是Jmeter? Jmeter工作原理是什么?

&#x1f345; 點擊文末小卡片&#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快 第一篇 什么是 JMeter&#xff1f;JMeter 工作原理 1.1 什么是 JMeter Apache JMeter 是 Apache 組織開發的基于 Java 的壓力測試工具。用于對軟件做壓力測試&a…

Linux網絡基礎1(一)之計算機網絡背景

文章目錄計算機網絡背景網絡發展認識 "協議"高小琴例子方言例子計算機網絡背景 網絡發展 獨立模式: 計算機之間相互獨立; 網絡互聯: 多臺計算機連接在一起, 完成數據共享; 局域網LAN: 計算機數量更多了, 通過交換機和路由器連接在一起; 廣域網WAN: 將遠隔千里的計算…

如何在數學建模賽中實現模型創新?

模型創新性在國賽數學建模中&#xff0c;完備性是論文的基本要求&#xff0c;而創新性則是決定論文能否脫穎而出的關鍵因素。所謂創新&#xff0c;并不僅僅指提出完全新穎的數學理論&#xff0c;而是能夠在已有方法的基礎上&#xff0c;通過新的問題切入點、假設修正、模型優化…

【重磅發布】flutter_chen_updater-版本升級更新

Flutter Chen Updater 一個功能強大的Flutter應用內更新插件&#xff0c;支持Android APK自動下載、安裝和iOS跳轉App Store。 ? 特性 ? 跨平臺支持: Android APK自動更新&#xff0c;iOS跳轉App Store? 智能下載: 支持斷點續傳、文件校驗、多重備用方案? 權限管理: 自動處…

docker 1分鐘 快速搭建 redis 哨兵集群

使用 docker-compose 1 分鐘搭建好 1主2從3哨兵的 redis 哨兵集群 目錄結構 redis-sentinel-cluster ├── check_redis.sh ├── docker-compose.yml ├── redis │ └── redis.conf ├── sentinel │ └── sentinel.confdocker-compose.yml 配置 version: 3…

Git與DevOps實戰:從版本控制到自動化部署

一、版本控制1.什么是版本控制&#xff1f;版本控制用于高效追蹤和管理項目開發中的代碼、配置及文檔變更歷史&#xff0c;確保團隊成員始終使用正確版本&#xff0c;并支持版本回溯、差異比較和文件恢復。它能帶來以下優勢&#xff1a;通過歷史記錄保障數據安全與完整性&#…

大模型——利用RAG構建智能問答平臺實戰

利用RAG構建智能問答平臺實戰 目前公司的智能問答平臺利用RAG技術構建,現給大家分享下通RAG技術構建智能問平臺的具體流程和原理。 一、什么是RAG RAG是檢索增強生成技術(Retrieval-Augmented Generation),目前是構建智能問答的重要技術。RAG相比傳統的檢索可以可以減少…

flume事務機制詳解:保障數據可靠性的核心邏輯

flume事務機制詳解&#xff1a;保障數據可靠性的核心邏輯 在數據采集過程中&#xff0c;“不丟數據、不重數據” 是核心需求。Flume 之所以能在分布式環境下保證數據可靠性&#xff0c;關鍵在于其內置的事務機制。Flume 通過在 “Source → Channel” 和 “Channel → Sink” …

第四十九天(springboot模版注入ThymeleafFreemarkerVelocity)

開發框架-SpringBoot 參考&#xff1a;Spring Boot 中文文檔 新建一個spring Boot 項目&#xff0c;修改服務器url為 aliyun.com 不然沒有與jdk8版本對應的java 選擇一個spring web 庫&#xff0c;點擊創建即可 來到這個頁面點擊運行 啟動的是8080端口&#xff0c;用127.0.0.1…

Spring MVC 九大組件源碼深度剖析(六):HandlerExceptionResolver - 異常處理的藝術

文章目錄一、異常處理的核心價值二、核心接口設計三、四大內置實現類源碼解析1. ExceptionHandlerExceptionResolver&#xff08;現代異常處理核心&#xff09;2. ResponseStatusExceptionResolver&#xff08;HTTP狀態碼處理&#xff09;3. DefaultHandlerExceptionResolver&a…

MCP(Model Context Protocol,模型上下文協議)介紹

1. 背景 隨著大語言模型&#xff08;LLM, Large Language Model&#xff09;的應用越來越廣泛&#xff0c;一個核心問題逐漸凸顯&#xff1a; 模型在對話或推理時&#xff0c;往往只能依賴有限上下文窗口。外部工具、知識庫、應用接口如何統一接入模型&#xff0c;缺乏標準協議…