陣列中只出現一次

2021-09-02 12:09:14 字數 1070 閱讀 7292

首先看看題目要求:

陣列a中,除了某乙個數字

x之外,其他數字都出現了三次,而

x出現了一次。請給出最快的方法找到x。

這個題目非常有意思,在本人部落格中有《

位操作基礎篇之位操作全面總結

》這篇文章介紹了使用位操作的異或來解決——陣列中其他數字出現二次,而x出現一次,找出x。有《

》這邊文章介紹了分組異或的方法來解決——陣列中其他數字出現二次,而x和y出現一次,找出x和y。而這個題目則是其他數字出現3次,x出現一次。

應該如何思考了?

前兩篇文章是利用兩個相同的數異或結果為0來計算的,但這個題目中其他數字是出現了3次,因此肯定不可以再使用異或了。

我們換乙個角度來看,如果陣列中沒有x,那麼陣列中所有的數字都出現了3次,在二進位製上,每位上1的個數肯定也能被3整除。如從二進位製上看有:

1:0001

5:0101

1:0001

5:0101

1:0001

5:0101

二進位制第0位上有6個1,第2位上有3個1.第1位和第3位上都是0個1,每一位上的統計結果都可以被3整除。而再對該陣列新增任何乙個數,如果這個數在二進位制的某位上為

1都將導致該位上

1的個數不能被

3整除。因此通過統計二進位製上每位1的個數就可以推斷出x在該位置上是0還是1了,這樣就能計算出x了。

推廣一下,所有其他數字出現n(n>=2)次,而乙個數字出現1次都可以用這種解法來推導出這個出現1次的數字。

示範**如下:

[cpp]view plain

copy

// 【白 話經典演算法系列之十七】陣列中只出現一次的數

//  by morewindows(  ) 

//  歡迎關注

#include 

#include 

int findnumber(int a, int n)  

int main()  

;  printf("%d\n", findnumber(a, maxn));  

return 0;  

陣列中只出現一次的數字

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