網(wǎng)站首頁 編程語言 正文
求缺省數(shù)字時(shí)可以使用異或進(jìn)行求解,時(shí)間復(fù)雜度為O(N)。
我們都知道,異或的特點(diǎn)就是相同為0,相異為1 ,比如:
這是3和3相異或的結(jié)果,為0, 同樣地,有4^4 = 0,5^5 = 0等等……
這也是我們思考這道題的出發(fā)點(diǎn):
既然相同異或就為0,那么我們是不是只要將此數(shù)組與一個(gè)完整數(shù)組(個(gè)人習(xí)慣稱為完全數(shù)組)挨個(gè)求異或,相同的數(shù)字就會(huì)被異或沒,剩下的那個(gè)數(shù)字(這個(gè)數(shù)字是在完全數(shù)組中留下的)是不是就是題給數(shù)組的缺省數(shù)字?
答案是肯定的:
此時(shí)剩下的數(shù)字就是4即為所求。
但是我們怎么樣用代碼去實(shí)現(xiàn)呢?
本質(zhì)上是兩兩求異或,非要兩個(gè)數(shù)組的數(shù)字對應(yīng)相異或嗎?(1-1,2-2,3-3,5-5,6-6,7-7)
我們可以很快的實(shí)現(xiàn)一個(gè)完全數(shù)組的創(chuàng)建,找到缺省數(shù)組的最小值,往后加(N+1)個(gè)數(shù)便可得到,但是如果題給的數(shù)組是亂序呢?我們無法做到一一對應(yīng)去求異或。
于是,奇妙的異或運(yùn)算便替我們省去了很多步驟。
異或運(yùn)算是有交換律的,即:a⊕b = b⊕a;
難理解的話我們來看一個(gè)例子:
假如現(xiàn)在有一個(gè)數(shù)組:{1,2,1,3,4};其中有兩個(gè) 1 重復(fù)了,我已如果對這個(gè)數(shù)組進(jìn)行兩兩異或結(jié)果是不是應(yīng)該為2^3^4的值呢?
很顯然,異或消去相同數(shù)并不需要對應(yīng),只要讓這個(gè)數(shù)字最終和一個(gè)跟它相同的數(shù)字異或就可以消去;所以,我們可以將完全數(shù)組與缺省數(shù)組混合起來成為一個(gè)數(shù)組兩兩異或,就可以求出那個(gè)缺省數(shù)字。
思想就是這個(gè)樣子,但是在實(shí)現(xiàn)時(shí),如果要將兩個(gè)數(shù)組合并為一個(gè)數(shù)組又得有多余的步驟,所以我的做法是將兩個(gè)數(shù)組各自兩兩異或、得到結(jié)果A和結(jié)果B;再將A與B異或得到缺省數(shù)字。
拙解
#include <stdio.h>
int fun(int arr[], int len);
int main()
{
int arr[] = { 78, 79, 81, 83, 82, 84 };
int len = sizeof(arr) / sizeof(arr[0]);
int res = fun(arr, len);
printf("%d\n", res);
return 0;
}
int fun(int arr[], int len)
{
int i, j;
int temp1 = 0, temp2 = 0;
int min = arr[0];
//確定完全數(shù)組起始值
for (i = 0; i < len; i++)
{
if (arr[i] < min)
{
min = arr[i];
}
}
//對完全數(shù)組進(jìn)行異或
for (j = min; j < (len + 1)+min; j++)
{
temp1 ^= j;
}
//對原始(缺數(shù))數(shù)組進(jìn)行異或
for (i = 0; i < len; i++)
{
temp2 ^= arr[i];
}
int res = temp1 ^ temp2;
return res;
}
原文鏈接:https://blog.csdn.net/leadera_/article/details/128262279
相關(guān)推薦
- 2022-11-14 gorm crud 指南
- 2022-08-15 Python利用Selenium實(shí)現(xiàn)自動(dòng)化驗(yàn)證登錄
- 2022-07-11 pandas如何計(jì)算同比環(huán)比增長_python
- 2022-11-01 python一行輸入多值的實(shí)現(xiàn)詳解_python
- 2022-05-27 Python?nonlocal關(guān)鍵字?與?global?關(guān)鍵字解析_python
- 2022-08-29 .NET?Core使用Eureka實(shí)現(xiàn)服務(wù)注冊_實(shí)用技巧
- 2023-03-15 React受控組件與非受控組件實(shí)例分析講解_React
- 2022-05-12 正則判斷只能輸入大于0的正整數(shù)
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支