題目:
乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。要求時間複雜度為o(n),控制項複雜度為o(1)
演算法思路:
如果乙個陣列當中,只要乙個數字出現一次,其他都是出現兩次,那麼我們只要把所有的數進行異或得到的就是結果
現在有兩個數字出現一次,那麼我們還是異或所有的數,最後的到的結果就是這兩個不想等的數字的異或結果
比如 2 4 3 6 3 2 5 5 最後異或就是 4 與 6 異或,那麼它們兩個異或的結果肯定不是0;也就是說這個結果數字的二進位制
當中至少有一位是1;我們在這個結果數字當中找到第乙個為1的位置,記為第n位,現在我們以第n位是不是1把原來的
陣列分為兩部分;再分別異或兩個陣列;
分組異或:
比如int a =
整個陣列異或的結果為3^5即0x0011 ^ 0x0101 = 0x0110
對0x0110,第1位(由低向高,從0開始)就是1。因此整個陣列根據第1位是0還是1分成兩組。
a[0] =1 0x0001 第一組
a[1] =1 0x0001 第一組
a[2] =3 0x0011 第二組
a[3] =5 0x0101 第一組
a[4] =2 0x0010 第二組
a[5] =2 0x0010 第二組
第一組有,第二組有,明顯對這二組分別執行「異或」解法就可以得到5和3了。
//#include "stdafx.h"
#include using namespace std;
//找到第乙個為1的位置
unsigned int findfirstbitis1(int num)
return indexbit;
}bool isbit1(int num , unsigned int indexbit)
int resultxor = 0;
for (int i = 0; i < nlength; i++)
//找到抑或結果數字當中的第乙個1的位置
unsigned int indexof1 = findfirstbitis1(resultxor);
num1 = num2 = 0;
for (int j = 0; j < nlength; ++j)
else
}}int _tmain(int argc, _tchar* argv)
; int i = 0;
int j = 0;
if (i == 0 && j != 0)
{ cout<<"您輸入的陣列的當中出現1次的只有乙個數字,它是:"《實現這個**的假設條件就是 陣列當中不會出現兩個以上只出現1次的數字,比如 1 2 3 4 5 6 7 8 這種情況是無法處理的!
陣列中只出現一次的數字
何海濤 劍指offer 名企面試官精講典型程式設計題 九度oj 題目描述 乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。輸入 每個測試案例包括兩行 第一行包含乙個整數n,表示陣列大小。2 n 10 6。第二行包含n個整數,表示陣列元素,元素均為int。輸...
陣列中只出現一次的數字
來自劍指offer 分析 如果整型陣列中只有乙個數字出現一次,我們只需將陣列中每個元素依次做異或操作,最終就得到了只出現一次的數字。因為自己與自己異或後,結果為0.現在,陣列中有兩個數字只出現一次,上述一次遍歷後將所有元素異或得不到那兩個數字。因此,我們試著將原陣列分成兩個子陣列,使每個子陣列中分別...
陣列中只出現一次的數字
package com.google.android public static void main string args int result new int 2 find data,result for int i result private static void find int dat...