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

总结:不服不行!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值