C語言練習:(力扣645)錯誤的集合

題目鏈接:645. 錯誤的集合 - 力扣(LeetCode)

集合 s 包含從 1n 的整數。不幸的是,因為數據錯誤,導致集合里面某一個數字復制了成了集合里面的另外一個數字的值,導致集合 丟失了一個數字 并且 有一個數字重復
給定一個數組 nums 代表了集合 S 發生錯誤后的結果。
請你找出重復出現的整數,再找到丟失的整數,將它們以數組的形式返回。

思路解析:

本題可以考慮兩個思路:

  • 數學方法

先對數組進行由小到大排序,因為缺失的數值介于前一個數值和后一個數值中間,并且在不缺失的情況下相鄰兩個數值差值為1,如果有數值重復,那么重復的數值和下一個不同的數值之間的差值為2,所以需要記錄前一個數值存儲在變量prev

📌

注意prev初始化為0,因為存在數組中缺失的數值為1,而如果數組中只有兩個元素,那么最大值為2,此時在數組中找不到一個數值使得重復的數值和下一個的不同兩個數值差值為2

先找到重復的數值,即下一個元素和當前元素cur相同時,存儲當前數值cur到新數組的第一個元素的位置,更新prev為當前的重復數值

再繼續循環,若當前數值與prev中存的數值差值大于1,說明此時已經找完了重復元素,因為不缺失數值時相鄰兩個數值差值為1,而此時prev中的數值和當前數值差值大于1,說明prev中的數值+1即為缺失的數值,將prev + 1存儲新數組的第二個位置后更新prev

當走完該循環時,還需要注意一個問題:如果缺失的數值是數組的最大值(例如122,缺失3),此時需要單獨判斷,因為不存在一個數值使得后一個元素和當前元素差值為2,所以當數組的最后一個元素不等于數組的大小時,此時即為缺失數組最大值

  • 異或運算

本題同樣可以考慮異或運算對重復數值和缺失數值分堆來求解,但是直接在原數組中對元素進行異或不可取

考慮到以下規律:

在原數組中,觀察到重復的數值和缺失的數值都出現偶數次,而其他數值均出現奇數次,如果構造一個1~n的不缺數的數組和原數組組合,那么重復的數值和缺失的數值都出現奇數次,而其他數值均出現偶數次,在異或運算中,相同的兩個數異或可以得到a^a = 0,而a^0 = a,故此時對構造的數組和原數組進行整體異或可以得到重復的數值和缺失的數值異或的結果值

故采用先構造一個數組和原數組進行整體異或,得到一個返回值ret即為重復數值和缺失數值的異或結果,因為異或運算的本質是找出兩個操作數二進制位不同的位置,所以計算結果的二進制位為1的位置即為重復的數值和缺失的數值相異的位置,此時可以采用循環結合右移運算符找到相異的位置(二進制位數的下標,例如1和5中倒數第三位不同),但是本次將采用返回值與返回值的負數形式相與計算得出最低的不同位,即int position = ret & (-ret);,但是注意該語句計算的不是不同的下標位置,而是具體的值,但是該值的二進制值中為1的位置為對應的兩個數不同的位置

找到最低的不同位之后,通過原數組和構造的數組中的元素與不同位的數值相與運算得到結果為0和不為0的數值,將二者分堆即可分出重復的數值和缺失的數值(因為重復的數值和缺失的數值不相同,所以二者不可能在同一堆中)

最后,因為暫時不知道重復的數值和缺失的數值具體所在的位置,所以需要遍歷原數組確定重復的數值存儲在新數組的第一個元素的位置,缺失的數值則放置到新數組的第二個位置

參考答案:

排序+調整(數學方法)

/** @lc app=leetcode.cn id=645 lang=c** [645] 錯誤的集合*/// @lc code=start
/*** Note: The returned array must be malloced, assume caller calls free().*/int cmp(const void *p1, const void *p2)
{return (*(int *)p1 - *(int *)p2);
}
int *findErrorNums(int *nums, int numsSize, int *returnSize)
{// 對已知數組進行從小到大排序qsort(nums, numsSize, sizeof(int), cmp);int *p = (int *)malloc(sizeof(int) * 2);// 定義變量記錄數組中上一個元素的位置,便于計算缺失的數值int prev = 0;// 遍歷數組// 1.如果找出的元素與prev中的值差值大于1,說明當前缺失的元素即為prev當前值的后一位數值// 2.如果找出的元素與prev中的值相等,說明遇到了相同元素for (int i = 0; i < numsSize; i++){int cur = nums[i]; // 遍歷數組if (cur == prev){// 如果相同則表示遇到相同元素p[0] = cur; // 記錄相同元素}else if (cur - prev > 1){// 如果不同且滿足二者差值大于1時,則表示中間有缺失元素,并且缺失元素即為prev當前大小+1p[1] = prev + 1;}prev = cur; // 更新prev}// 存在一種情況:數組中最后一個數值小于數組長度if (nums[numsSize - 1] != numsSize){// 數組中缺失的數值為數組的最大值p[1] = numsSize;}*returnSize = 2;return p;
}
// @lc code=end

異或運算

/** @lc app=leetcode.cn id=645 lang=c** [645] 錯誤的集合*/// @lc code=start
/*** Note: The returned array must be malloced, assume caller calls free().*/int *findErrorNums(int *nums, int numsSize, int *returnSize)
{int *p = (int *)malloc(sizeof(int) * 2);int ret = 0;// 構造一個1-n的不缺數值的數組與原來的數組進行整體異或for (int i = 1; i <= numsSize; i++){// 將不缺數的數組進行整體異或ret ^= i;// 將缺數的數組與不缺數的數組進行整體異或ret ^= nums[i - 1];}// 當前ret中存儲的值為重復數值和缺失數值異或的結果// 找出重復數值和缺失數值二者最低的不同位// 可以代替原來的移位找最低不同位算法int position = ret & (-ret);// 定義兩個數值分別存儲重復數值和缺失的數值int num1 = 0;int num2 = 0;// 根據最低的不同二進制位對原數組進行分組for (int i = 0; i < numsSize; i++){if ((nums[i] & position) == 0){num1 ^= nums[i];}else{num2 ^= nums[i];}}// 根據最低的不同二進制位對構造數組進行分組for (int i = 1; i <= numsSize; i++){if ((i & position) == 0){num1 ^= i;}else{num2 ^= i;}}// 因為當前不確定重復的數值和缺失的數值在num1和還是num2,所以需要與原數組進行再一次的比較找出重復數值,剩下的就是缺失的數值*returnSize = 2;for (int i = 0; i < numsSize; i++){if (nums[i] == num1){p[0] = num1;p[1] = num2;return p;}}// 如果已經確定則直接返回p[0] = num2;p[1] = num1;return p;
}
// @lc code=end

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

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

相關文章

枚舉和聯合(共用體)

目錄 枚舉枚舉類型的定義枚舉的優點 聯合&#xff08;共用體&#xff09;聯合類型的定義聯合的特點聯合大小的計算 枚舉 枚舉顧名思義就是一一列舉&#xff0c;把可能的取值一一列舉 枚舉類型的定義 enum Day &#xff0c; enum Sex &#xff0c;enum Color 都是枚舉類型{}中…

springboot生成圖片驗證碼(借鑒并分析)

目錄 一、CaptchaUtil代碼展示二、CaptchaController 代碼展示 一、CaptchaUtil代碼展示 package com.minster.yanapi.utils;import com.google.code.kaptcha.impl.DefaultKaptcha;import com.google.code.kaptcha.util.Config; import org.springframework.context.annotatio…

MMDetection3D v1.3.0安裝教程

MMDetection3D v1.3.0安裝教程 1. 系統環境2. 安裝2.1 基本環境安裝2.2 調整具體版本2.3 驗證2.4 安裝MinkowskiEngine和TorchSparse 3. 最終環境配置 根據 v1.3.0版本官方手冊測試后的安裝配置&#xff0c;親測可行。 1. 系統環境 項目版本日期Ubuntu18.04.06 LTS-顯卡RTX 2…

曾桂華:車載座艙音頻體驗探究與思考| 演講嘉賓公布

智能車載音頻 I 分論壇將于3月27日同期舉辦&#xff01; 我們正站在一個前所未有的科技革新的交匯點上&#xff0c;重塑我們出行體驗的變革正在悄然發生。當人工智能的磅礴力量與車載音頻相交融&#xff0c;智慧、便捷與未來的探索之旅正式揚帆起航。 在駕駛的旅途中&#xff0…

安裝 Distribution Registry

Distribution Registry是由容器部署&#xff0c;所有前提是需要安裝docker 參考文檔&#xff1a;https://docs.docker.com/engine/install/centos/ Registry 官網文檔 https://distribution.github.io/distribution/ 安裝Registry倉庫 docker run -d -p 5000:5000 --restartalw…

通過css修改video標簽的原生樣式

通過css修改video標簽的原生樣式 描述實現結果 描述 修改video標簽的原生樣式 實現 在控制臺中打開設置&#xff0c;勾選顯示用戶代理 shadow DOM&#xff0c;就可以審查video標簽的內部樣式了 箭頭處標出來的就是shodow DOM的內容&#xff0c;這些內容正常不可見的&#x…

MySQL 用了哪種默認隔離級別,實現原理是什么?

MySQL 的默認隔離級別是 RR - 可重復讀&#xff0c;可以通過命令來查看 MySQL 中的默認隔離級別。 RR - 可重復讀是基于多版本并發控制&#xff08;Multi-Version Concurrency Control&#xff0c;MVCC &#xff09;實現的。MVCC&#xff0c;在讀取數據時通過一種類似快照的方…

視覺三維重建colmap框架的現狀與未來

注&#xff1a;該文章首發3D視覺工坊&#xff0c;鏈接如下3D視覺工坊 前言 眾所周知&#xff0c;三維重建的發展已經進入了穩定期&#xff0c;尤其是離線方案的發展幾乎處于停滯期&#xff0c;在各大論刊上也很少見到傳統sfmmvs亮眼的文章。這也不難理解&#xff0c;傳統的多視…

MYSQL 解釋器小記

解釋器的結果通常通過上述表格展示&#xff1a; 1. select_type 表示查詢的類型 simple: 表示簡單的選擇查詢&#xff0c;沒有子查詢或連接操作 primary:表示主查詢&#xff0c;通常是最外層的查詢 subquery :表示子查詢&#xff0c;在主查詢中嵌套的查詢 derived: 表示派…

【王道數據結構】【chapter8排序】【P360t2】

試編寫一個算法&#xff0c;使之能夠在數組L[1……n]中找出第k小的元素&#xff08;即從小到大排序后處于第k個位置的元素&#xff09;&#xff08;可以直接采用排序&#xff0c;但下面的排序的代碼只是為了方便核對是不是第k小的元素&#xff0c;k從0開始計算&#xff09; #in…

出海手游收入一路高歌,營銷上如何成功?

出海手游收入一路高歌&#xff0c;營銷上如何成功&#xff1f; 以RPG和SLG為代表的中重度游戲一直是國內廠商在海外市場的傳統優勢品類&#xff0c;因為它們具有較高的投資回報率&#xff0c;是國內廠商在國際市場上取得成功的“吸金”利器。 據伽馬數據發布的《2023全球移動游…

SpringCloud搭建微服務之Consul服務配置

1. 概述 前面有介紹過Consul既可以用于服務注冊和發現&#xff0c;也可以用于服務配置&#xff0c;本文主要介紹如何使用Consul實現微服務的配置中心&#xff0c;有需要了解如何安裝Consul的小伙伴&#xff0c;請查閱SpringCloud搭建微服務之Consul服務注冊與發現 &#xff0c…

steam怎么付款

信用卡支付 登錄Steam賬戶&#xff0c;選擇需要購買的游戲或其他物品&#xff0c;點擊“加入購物車”。在購物車頁面點擊“去結賬”按鈕&#xff0c;進入付款頁面。在付款頁面選擇信用卡付款方式&#xff0c;填寫信用卡信息&#xff0c;輸入驗證碼&#xff0c;點擊確認付款。 …

Servlet 新手村引入-編寫一個簡單的servlet項目

Servlet 新手村引入-編寫一個簡單的servlet項目 文章目錄 Servlet 新手村引入-編寫一個簡單的servlet項目一、編寫一個 Hello world 項目1.創建項目2.引入依賴3.手動創建一些必要的目錄/文件4.編寫代碼5.打包程序6.部署7.驗證程序 二、更方便的處理方案&#xff08;插件引入&am…

autocrlf和safecrlf

git遠程拉取及提交代碼&#xff0c;windows和linux平臺換行符轉換問題&#xff0c;用以下兩行命令進行配置&#xff1a; git config --global core.autocrlf false git config --global core.safecrlf true CRLF是windows平臺下的換行符&#xff0c;LF是linux平臺下的換行符。…

98 greenplum 集群搭建過程中碰到的幾個問題

前言 最近有搭建 greenplum 集群的需求 然后 在搭建的過程中碰到了一些問題, 還是有一些時間開銷 并且問題也稍微有些復雜, 因此記錄一下 1. Do not have enough valid segments to start the array. 報錯日志信息如下 20220408:14:15:29:021638 gpstart:gp1:gpadmin-[I…

基于springboot+vue的公交線路查詢系統

博主主頁&#xff1a;貓頭鷹源碼 博主簡介&#xff1a;Java領域優質創作者、CSDN博客專家、阿里云專家博主、公司架構師、全網粉絲5萬、專注Java技術領域和畢業設計項目實戰&#xff0c;歡迎高校老師\講師\同行交流合作 ?主要內容&#xff1a;畢業設計(Javaweb項目|小程序|Pyt…

Find My運動相機|蘋果Find My技術與相機結合,智能防丟,全球定位

運動相機設計用于在各種運動和極限環境中使用&#xff0c;如徒步、登山、攀巖、騎行、滑翔、滑雪、游泳和潛水等&#xff0c;它們通常具有防抖防震、深度防水和高清畫質的特點&#xff0c;能夠適應顛簸劇烈的環境&#xff0c;甚至可以承受一定程度的摔落&#xff0c;一些運動相…

基于systick實現獲取系統運行時間

基于systick實現獲取系統運行時間 文章目錄 基于systick實現獲取系統運行時間systick.c代碼結構:代碼功能:總結 systick.c #include <stdint.h> #include "gd32f30x.h"static volatile uint64_t g_sysRunTime 0;/** ***************************************…

數學建模【聚類模型】

一、聚類模型簡介 “物以類聚&#xff0c; 人以群分”&#xff0c;所謂的聚類&#xff0c;就是將樣本劃分為由類似的對象組成的多個類的過程。聚類后&#xff0c;我們可以更加準確的在每個類中單獨使用統計模型進行估計、分析或預測&#xff0c;也可以探究不同類之間的相關性和…