陣列中只出現一次的數字41

2021-07-13 17:18:19 字數 1538 閱讀 4927

題目描述:乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。要求時間複雜度是o(n),空間複雜度是o(1)。例如,因為只有4,6這兩個數次出現一次,所以輸出4和6。

解題思路:

陣列裡有兩個數字只出現一次,其他數字都出現兩次。

異或性質:任何乙個數字異或它自己都等於0.

將陣列拆分成兩個子陣列,使得每個子陣列包含乙個只出現一次的數字。

首先將所有數字執行異或操作,得到result。(result是兩個只出現一次的數字的異或結果)

在result中找到自右邊起的第乙個為1的位的位置,標記為n位。

將原陣列分為兩個組,第一組中每個數字的第n位都是1;第二組中每個數字的第n位都是0.

由於result是這兩個只出現一次的數字的異或結果,所以它倆肯定被分配到不同的子陣列。而其他出現兩次的數字肯定一起被分配到用乙個子陣列。

再分別對兩個子陣列求異或,便能分別找出出現一次的數字。

測試用例:

int main();

//兩個結果

int num1 = 0;

int num2 = 0;

//查詢

//輸出結果

std::cout

<< "num1: "

<< num1 << std::endl << "num2: "

<< num2; //output: 6, 4

return

0;}

函式實現:

//判斷在number的二進位制表示中從右邊數起的第一位indexbit是不是1

bool isbit1(int number, unsigned

int indexbit)

//在整數number的二進位制表示中找到最右邊是1的位

unsigned

int findfirstbitis1(int num)

return indexbit;

}//主函式

if(data == null || length <= 2)

return;

//對所有元素執行一次異或操作,獲得兩個不同數字的異或結果

int resultexclusiveor = 0;

for(auto i = 0; i < length; ++i)

resultexclusiveor ^= data[i];

//在resultexclusiveor中找到自右邊起的第乙個為1的位

unsigned

int indexof1 = findfirstbitis1(resultexclusiveor);

for(auto j = 0; j < length; ++j)

//最終num1和num2分別儲存了只出現一次的那兩個數字

}

陣列中只出現一次的數字

何海濤 劍指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...