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;
}
总结:不服不行!