找出乙個陣列中的」單身「

2021-07-11 12:58:08 字數 2494 閱讀 9935

已知乙個陣列中,除了乙個數字出現一次外,其他數字都出現兩次,試找出這個數~~

思路分析:當看到這個題目,我就想,既然只有乙個數出現一次,那麼我們可以遍歷這個陣列,只要遇到相同的兩 個

數,就把它們置為乙個比較大的數,最後輸出那個沒有被改變的數。

#define _crt_secure_no_warnings 1

#includeint main()

for (i = 0;i < 8;i++)

}} for (i = 0;i < 9;i++)

system("pause");

return 0;

}

**分析:

**缺陷:**時間複雜度為o(n^2),還有將相同的數分別置成32767,我們不能保證陣列中原本就沒有                              這個 數。

**亮點:使用了一種比較高階的方法求出兩數的平均值,這樣就能防止資料過大,兩數之和發生溢位。

下邊,我來重點解析這種求平均數的妙法~

求平均數的另一種方法:

a和b的平均數mid,mid = (a - b)/2+a;這種方法可以適用於任何型別數的平均數,而上述位運算的方法只能

適用於整形數,且兩個數的符號位相同的那種。

學習程式設計這麼久,我們發現,經常乙個題目有好多種方法,我們應該擇優,也就是,我們的目的不是解決問題,

而是更好的解決問題。上邊求平均數的方法中,我們可以發現兩個相同的數異或的結果是0,看看我們可否利用

這種方法解決呢??

#define _crt_secure_no_warnings 1

#includeint main()

; int i = 0;

int ret = 0;

for (i = 0;i < sizeof(arr) / sizeof(arr[0]);i++)

printf("%d",ret);

system("pause");

return 0;

}

上述方法很好的利用了異或運算子,時間複雜度是o(n)。由於**比較少,所以沒有必要寫成函式。

如果乙個陣列中有兩個數沒有成對出現,其他數都成對,那麼我們又是怎樣找到這兩個數呢??

如果我們能將兩個不同的數分開,然後利用上述找乙個數的方法也可以找出這兩個數。我們將實現方法寫成函式的

形式。看以下**:

#define _crt_secure_no_warnings 1

#include#includevoid find_two_num(int arr, int n, int *p1, int *p2)

while (((ret >> pos) & 1) != 1)

for (i = 0;i < n;i++) }

*p2 = ret ^ *p1;

}int main()

; int num1 = 0;

int num2 = 0;

find_two_num(arr,8,&num1,&num2);

printf("%d %d",num1,num2);

system("pause");

return 0;

}

在以往的函式中,我們一般只需要乙個返回值,而這個程式需要接受兩個返回值,怎麼辦呢??利用返回型引數。

也就是傳給函式的是儲存資料的位址。

**解析:我們的目標是將這個陣列的元素分開,

比如4,5只出現一次,100^101 = 001,我們根據為1的那一位也就是第0位是否為1將資料分成兩組,相同的數必

然被分到一組,不同的數必將位於不同的組,然後將每個組異或就可得到結果~~

我們沒有必要將分的組的數儲存起來,因為沒有必要,只需要將組內的所有元素異或就行。

還有,我們只要求出乙個組的單獨出現的數,只需要將兩個數異或的結果(即為**中的ret)異或已經求出的

出現一次的數就可以~推導如下:

比如:a ^ b = m;

則: a ^ b ^a = m^a;

b = m ^a;

特別注意:位運算子 的優先順序不太高(低於算術運算子的優先順序),所以必要的時候不要吝嗇括號哦~~

在乙個陣列中找出top K的數

這個基本都是老生常談了,看資料量有多大,建乙個小根堆,或者用快速排序的方法來完成這個題。下面給出快速排序的方法,直接上 了。include include include void quicksort int arr,int low,int high arr i val quicksort arr,...

找出乙個陣列中各個數字出現的次數

看了prime第一章,突發奇想了乙個問題,如何寫乙個演算法去找出乙個陣列中各個數字出現的次數呢?方法一 可以使用我們經常寫的演算法,氣泡排序之類的,首先對陣列進行排序,然後根據prime中第一章的寫法。算出每個數字出現的次數。include include using namespace std i...

找出乙個陣列中的前k個高頻元素

給定乙個非空的整數陣列,返回其 現頻率前 k 高的元素。例如,給定陣列 1,1,1,2,2,3 和 k 2,返回 1,2 注意 你可以假設給定的 k 總是合理的,1 k 陣列中不相同的元素的個數。第一步基本都是一致的,需要統計出每個元素的出現次數 先遍歷一遍陣列,以陣列的值做key存放到map中,初...