2015年秋季騰訊校園招聘開發崗筆試題 四道大題三、四
阿新 • • 發佈:2019-01-03
3. 如圖所示,系統中有三個程序 Producer , Transmitter 和 Consumer 。 Producer 和 Transmitter 共用緩衝區 ProduceBuf , Consumer 和 Transmitter 共用緩衝區 ConsumeBuf 。
Producer 程序負責不斷地將輸入資訊送入 ProduceBuf ; Transmitter 程序負責從 ProduceBuf 中取出資訊進行處理,並將處理結果送到 ConsumeBuf ; Consumer 程序負責從 ConsumeBuf 中讀取結果並輸出。
假設 ProduceBuf 中最多可放 12 個資訊,現已放入了 3 個資訊; ConSumeBuf 最多可放 6 個資訊。試寫出正確實現程序 Producer,Transmitter 和 Consumer 的同步與互斥的演算法
4. 春節期間小明使用微信收到很多個紅包,非常開心。在檢視領取紅包記錄時發現,某個紅包金額出現的次數超過了紅包總數的一半。請幫小明找到該紅包金額。寫出具體演算法思路和程式碼實現,要求演算法儘可能高效。
第三題不太會,就寫了一點獲取鎖,釋放鎖。
第四題,真是被坑了,第四題這樣的題真的很討厭,其實很簡單就是排序中中間值,演算法高效,那就快排嘍,空間複雜度O(1),事件複雜度O(nlogn),當時咋就沒想起來呢,傻傻的用了map, T.T
程式碼如下:
void quicksort(float *a,int x,int y) { if (x > y) return; float m = a[x]; int j = y; int i = x; while (i<j){ while (a[j] >= m && j > i) --j; a[i] = a[j]; while (a[i] <= m && i < j) ++i; a[j] = a[i]; } a[i] = m; quicksort(a,x,i-1); quicksort(a,i+1,y); } float findmax(float a[], int n) { quicksort(a,0,n-1); return a[n/2]; }
真是極致!原來還有一個更高效的演算法,‘打擂’演算法,一次遍歷就找出出現次數最大的數,程式碼如下:
float MoreThanHalfNum_Solution(vector<float> a) {
float x;
int y = 0;
for (int i = 0; i < int(a.size()); ++i){
if (y == 0 || (a[i] - x <0.00000001&&a[i] - x >0.00000001))
x = a[i], y++;
else
--y;
}
return x;
}
總結:不服不行!