C 演算法之 陣列中只出現一次的數字

2021-06-27 21:25:05 字數 1383 閱讀 7500

題目:

乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。要求時間複雜度為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...