1. 程式人生 > >2015年秋季騰訊校園招聘開發崗筆試題 四道大題三、四

2015年秋季騰訊校園招聘開發崗筆試題 四道大題三、四

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 的同步與互斥的演算法

(要求:用類 C 語言描述,條理清楚,註釋恰當;)

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;
	}

總結:不服不行!