已知乙個陣列中,除了乙個數字出現一次外,其他數字都出現兩次,試找出這個數~~
思路分析:當看到這個題目,我就想,既然只有乙個數出現一次,那麼我們可以遍歷這個陣列,只要遇到相同的兩 個
數,就把它們置為乙個比較大的數,最後輸出那個沒有被改變的數。
**分析:#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,看看我們可否利用
這種方法解決呢??
上述方法很好的利用了異或運算子,時間複雜度是o(n)。由於**比較少,所以沒有必要寫成函式。#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;
}
如果乙個陣列中有兩個數沒有成對出現,其他數都成對,那麼我們又是怎樣找到這兩個數呢??
如果我們能將兩個不同的數分開,然後利用上述找乙個數的方法也可以找出這兩個數。我們將實現方法寫成函式的
形式。看以下**:
在以往的函式中,我們一般只需要乙個返回值,而這個程式需要接受兩個返回值,怎麼辦呢??利用返回型引數。#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中,初...