數組中只出現一次的數字

題目:一個整型數組里,除了兩個數字以外,其他數字都出現了兩次,請寫程序找到這兩個只出現一次的數字。要求:時間復雜度為O(n),空間復雜度為O(1).

分析:看到這題,首先要明白,這是求兩個數字。還要明白其要求,空間復雜度和時間復雜度。如果沒有這些約束我們可以有很多方法解,如Hash、逐次遍歷等。

? ? ? ? 當常規方法無法滿足要求,我們就可以使用一個神奇的工具:位運算。

? ? ? ? 我們首先看看當只是一個數字是只出現一次怎么求解。

? ? ? ? 異或運算有一個性質:任何一個數字異或自己都等于0。多個數字依次做異或運算,相同的數字會抵消。看下例:

? ? ? ? 例如一個輸入數組:{1,2,3,2,3}

? ? ? ? 0001

? ? ? ? 0010 ?異或得到:

? ? ? ? 0011

? ? ? ? 0011 異或得到:

? ? ? ? 0000

? ? ? ? 0010 異或得到:

? ? ? ? 0010

? ? ? ? 0011 異或得到:

? ? ? ? 0001

? ? ? ? 看到木有,數組里面相同的數字都抵消了。這里只是針對只有一個數字是只出現一次的。其他情況不成立。

? ? ? ??

? ? ? ?但是本題里有兩個,直接這么做事不成立的,怎么辦? 我們想到,用位整個數組運算以后得到的結果有什么作用呢?很明顯,出現兩次的數在位運算后抵消了,那么其實就是兩個只出現一次的兩個數做的位運算。例如:

? ? ? {1,2,2,3}

? ? ? 0001

? ? ? 0010 異或得到:

? ? ? 0011

? ? ? 0010 異或得到:

? ? ? 0001

? ? ? 0011 異或得到:

? ? ? 0010 ? ? ?這個結果和 ?1^3=0010是一樣了,驗證了上面的理論。

? ? ? 好了,有了這個有用的信息,那么我們就可以用這個結果中位為1來區分成兩組數據,很顯然這兩組數據中都分別只包含一個只出現一次的數字(作的異或運算嘛,=1,說明它們是不同的。)。然后再用最開始講到的方法去做就OK拉。代碼貼上來:

? ??

bool Judge(int pData, int BitIndex)
{pData = pData >> BitIndex;return (pData & 1);
}
void FindOnlyOneNumbers(int pData[],int length, int &num1,int &num2)
{//1.異常檢測if (pData == NULL || length < 2)return;//2.求出區分位int resultExclusive = 0;for (int i = 0; i < length; i++)resultExclusive ^= pData[i];      //假如只有一個數字是只出現一次,那么這個結果就是這個數字,如果兩個的話,那么這個數字中位為1即是只出現一次的兩個數的不同位。//3.接下來為了區分兩者,我們尋找區分位最右邊為1的位int indexCount = 0;while (resultExclusive&1==0&&indexCount<=8*sizeof(int)){resultExclusive >> 1;indexCount++;}//4.然后按照區分位的不同,將pData分成兩組,這里沒必要用兩個數組保存,直接進行用位運算分別計算兩個數就ok了int resultExclusive1 = 0, resultExclusive2 = 0;for (int i = 0; i < length; i++){if (Judge(pData[i],indexCount))resultExclusive1 ^= pData[i];elseresultExclusive2 ^= pData[i];}num1 = resultExclusive1;num2 = resultExclusive2;
}

?

? ? ? ??

轉載于:https://www.cnblogs.com/menghuizuotian/p/3828909.html

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

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

相關文章

iOS工作筆記之NSClassFromString

id myObj [[NSClassFromString("MySpecialClass") alloc] init]; 和 id myObj [[MySpecialClass alloc] init]; 是一樣的。但是&#xff0c;如果你的程序中并不存在MySpecialClass這個類&#xff0c;下面的寫法會出錯&#xff0c;而上面的寫法只是返回一個空對象而…

Maven 使用bat批量清除本地倉庫的lastUpdated文件

echo off set REPOSITORY_PATHC:\Users\Administrator\.m2\repository rem 正在搜索... for /f "delims" %%i in (dir /b /s "%REPOSITORY_PATH%\*lastUpdated*") do ( del /s /q %%i ) rem 搜索完畢 pause 新建一個文件txt文件&#xff0c;把.txt后綴…

“ddl”有一個無效 SelectedValue,因為它不在項目列表中。

“ddl_ekt”有一個無效 SelectedValue,因為它不在項目列表中。 怎么回事 現象&#xff1a; 在用戶控件的page_load事件里綁定下拉框&#xff0c;報上面錯誤 解決&#xff1a; 將下拉框綁定&#xff0c;放在page_Init事件里 這可能跟服務器加載控件的生命過程有關系轉載于:https…

springbot 注入多實例

方式一&#xff1a; 在需要多實例的類上加入注解&#xff1a; Scope("prototype") 方式二&#xff1a; 在啟動類上加入&#xff1a; BeanScope(value ConfigurableBeanFactory.SCOPE_PROTOTYPE, proxyMode ScopedProxyMode.TARGET_CLASS)public PrototypeClass…

javascript日歷插件

javascript日歷插件 原文:javascript日歷插件javascript日歷插件 最近在嘗試著寫javascript日歷插件&#xff0c;所以也到github上看國外人日歷源碼&#xff0c;或者國內人寫的好點的&#xff0c;也在研究點&#xff0c;雖然看到網上有一大把的日歷控件&#xff0c;但是沒有幾個…

idea 重啟

1、通過File–>Invalidate Caches/Restar...進入重啟窗口 2、選擇自己所需要的重啟方式&#xff0c;四個按鈕&#xff0c;一共三種重啟方式&#xff1a; Invalidate and Restart 清空緩存并重啟。Invalidate 清除緩存&#xff0c;下次打開重啟。Cancel 取消。Just Restart …

Kernel Page Global Directory (PGD) of Page table of Process created in Linux Kernel

Kernel Page Global Directory (PGD) of User process created 在早期版本: 在fork一個進程的時候&#xff0c;必須建立進程自己的內核頁目錄項&#xff08;內核頁目錄項要與用戶空間的頁目錄放在同一個物理地址連續的頁面上&#xff0c;所以不能共享&#xff0c;但所有進程的內…

POI 導出文件以文件流形式返回

POI工具類 import java.io.UnsupportedEncodingException; import javax.servlet.http.HttpServletResponse; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFRow; import o…

Json串和java對象進行轉時

json-lib-xxx.jarezmorph-xxx.jar //>依賴包 JsonConfig config new JsonConfig();//有選擇性的過濾掉一些屬性值 JSONUtils.getMorpherRegistry().registerMorpher( new DateMorpher(new String[] { "yyyy-MM-dd" }));//注冊一個json轉為java.util.date的日期格…

Mybatis Integer類型參數值為0時判斷為空、空字符串不通過

根據狀態查詢是&#xff0c;由于status是Integer類型&#xff0c;所以當前狀態為0時&#xff0c;變成了查詢了所有的狀態信息。 <if test"requestParam.status ! null and requestParam.status ! ">and s.status #{requestParam.status} </if> 原因&a…

BZOJ 3391: [Usaco2004 Dec]Tree Cutting網絡破壞(搜索)

這道直接遍歷一遍求出每個點的子節點數目就行了 CODE&#xff1a;#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>using namespace std;#define maxn 50010int b[maxn],q[maxn],id[maxn],ans[maxn];bool cmp(int x,int y){re…

Fast Matrix Operations

uva11992:http://uva.onlinejudge.org/index.php?optioncom_onlinejudge&Itemid8&pageshow_problem&problem3143 題意&#xff1a;給你n*m的矩陣初始化的時候矩陣里面的元素全部是0&#xff0c;對于這個矩陣有3中操作。 1 x1 y1 x2 y2 v 把&#xff08;x1 y1 x2…

linux ll命令無效

1.編輯~/.bashc vim ~/.bashc 若vi/vim命令無效&#xff0c;參考 bash: vi: command not found/bash: vim: command not found 2.重新執行剛修改的初始化文件 source ~/.bashc

jquery不同版本沖突導致低版本功能不能用

oConflict() 方法讓渡變量 $ 的 jQuery 控制權。 該方法釋放 jQuery 對 $ 變量的控制。 使用方法&#xff1a; var jq $.noConflict();//轉換控制權 jq(document).ready(function () { jq("#outside").click(function () {你的操作...... }); }); });轉載于:https:/…

struts2+jquery 實現ajax登陸

一、新建一個web項目&#xff1a;test,配置好struts2的環境(詳細配置見&#xff1a;http://www.cnblogs.com/wuweidu/p/3841297.html) 導入Jquery的js文件到項目 二、在com.action包下&#xff0c;新建一個loginAction.java loginAction.java的代碼如下 package com.action;imp…

hdu 2026 首字母變大寫

題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid2026 題目大意&#xff1a;將一個英文句子&#xff0c;每個單詞第一個首字母變大寫。 1 #include <stdio.h>2 int main (void)3 {4 int i;5 char ch[100];6 while(gets(ch))7 {8 for (i0; c…

Docker Kafka 單機版安裝

一、安裝 下載library/zookeeper并運行 docker run --name zookeeper -d -p 2181:2181 -v /etc/localtime:/etc/localtime library/zookeeper 測試zookeeper端口是否通wget IP:2181 下載wurstmeister/kafka并運行 docker run -d --name kafka -p 9092:9092 --link zookeeper…

HDU1429勝利大逃亡(續)HDU 1885 Key Task BFS+狀態壓縮+水

HDU1429 只有10把鑰匙 1<<10足夠了 標記用三維數組 用Linux好不習慣 繼續克服&#xff5e; #include <stdio.h> #include <string.h> #include <stdlib.h> #include <limits.h> #include <malloc.h> #include <ctype.h> #include &l…

Docker 安裝nginx,并掛載文件

創建掛載所需目錄&#xff1a; mkdir /test/server/nginx/{conf,logs,html,conf.d} /test/server/nginx/conf創建nginx.conf文件&#xff0c;并編輯: user nginx; worker_processes 1;error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid;events {wor…

http解碼-5

http://www.freebuf.com/articles/web/18084.html (1) 在 前端安全技術中常見的編碼繞過技術利用的就是不同系統間的編碼位寬(addslashes()樓哦的那個)&#xff0c;不同編碼的解碼順序(htmlParserjavascriptParser的解碼順序)&#xff0c;不同的解碼規則(unicode->ascii轉換…