快速找到整型數組中的特異數

解釋: 特異數:在一個整型數組中僅出現一次的數。

在算法設計中常常要求找出一個長度爲N的數組A中存在的“特異數”,根據算法要求,可以分爲以下幾類:

1、排序法:時間複雜度O(NlogN),空間複雜度O(1)
算法思想:通過快速排序實現對於原數組A的排序,然後遍歷數組,判斷數組中元素與其前後元素是否相同,如果相同則繼續遍歷,否則返回該元素。

2、位操作:時間複雜度O(N),空間複雜度O(1)
2.1 非特異性數字出現次數爲偶數:時間複雜度爲O(N)
偶數個相同的整型數字“亦或”後爲0,而奇數個整型數字“亦或”後爲本身。
算法思想:在算法設計過程中考慮使用“亦或(^)”運算。通過遍歷數組A,將數組元素與前面元素的亦或結果進行亦或運算,遍歷結束返回的結果即爲數組中的特異數。
核心代碼如下:
int result = A[0]; 
for(int i=1; i<N; i++)
result = result ^ A[i]; 

2.2 非特異性數字出現次數爲奇數:時間複雜度爲O(32*N)
當非特異性數字出現次數爲奇數時,可以發現基本的位運算無法滿足算法要求,但是可以通過統計所有元素二進制表示是對應位置出現的1的個數,對每位中1的個數求和,然後對k取餘(其中k指非特異性數字出現的次數),然後將每位與0取“或(|)”運算得到最終結果。

算法思想:首先定義一個長度爲32的數組B,該數組每個元素對應原數組元素二進制表示的每位中1的個數,通過兩層循環實現算法:外層循環i從0~31,對應數組B中的元素,內層循環遍歷數組A,統計元素對應位置i出現1的次數,然後將B[i]對k取餘,作爲最終結果在該位置的數字,依次處理得到最終結果。
核心代碼如下:
int[] bitsNum = new int[32]; 
int result = 0; 
for(int i=0; i<32; i++) { 
for(int j=0; j<N; j++) {
bitsNum[i] += (A[j] >> i) & 1; 
result = result | ((bitsNum[i]%3)<<i); 
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章