腾讯2015(2016届)实习生校招笔试,除了选择题外,还有五道大题,其中三道算法类的题。
第一题:抽奖算法实现
题目:
一个商场进行一场抽奖活动,其中有两个奖项,第一个奖项A抽中的概率是1/6,第二个奖项B抽中的概率是5/6;用C语言编码实现这个抽奖程序。 题目通过一个XML文档给出。
基本思想:
- 生成一个随机数
- 随机数对6取余,得到的余数一定是0、1、2、3、4、5共六个数
- 将这六个数分成两份(A和B),其中一份只有0这一个项,其余一份有1、2、3、4、5五个项。对随机数取余后的数进行比较,看它那一份中,借此判断出本次抽奖的结果
源代码:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
bool draw() // 抽奖函数实现
{
int ran; // 记录随机数对六取余的值
srand( (unsigned)time( NULL ) ); // 置随机数种子
ran = rand()%6; // 随机数对6取余
if(0 == ran) // 若ran为0
return true; // 返回true
else // 若ran不为0 ,返回false
return false;
}
int main()
{
char ret;// 记录结果
if(draw()) // 进行抽奖
ret='A';// 返回true,抽奖结果为A
else // 否则结果为B
ret='B';
printf("抽奖结果为:%c\n",ret); // 输出抽奖结果
return 0;
}
第二题:整形长度算法实现
题目:
在不使用sizeof()函数的情况下,取出本机的整形所占位数,如32位、64位等。
基本思想:
整数1,一直左移,当移到小于0的时候,它移了多少位,本机的整形就占用多少位。
源代码:
#include <stdio.h>
int main()
{
int x=1;
int i=1;
while(x>0)
{
x=x<<1;
i++;
}
printf("%d\n",i);
return 0;
}
其他方法
http://blog.csdn.net/MichealGeng/article/details/45148995
第三题:C/S模型压力算法实现
题目:
在某个C/S模型中,服务器最大的处理量是每秒10000次,设计一个算法,保证服务器可以正常运行。
基本思想:
- 客户端每发出一个请求,都保存在服务端的请求队列中,若服务端请求队列等于10000,以后的请求,都不加入队列,且对客户端做出异常反馈。
- 客户端每发来一个请求,处理完请求后,计算等待时间,若等待时间大于1秒,将请求队列中的所有请求发送给服务端处理功能模块,清空等待队列,清空等待时间
- 周而复始进行循环
源代码:
#include<time.h>
double Clock_start = 0; // 记录开始时间
double Clock_end = 0; // 记录等待时间
int count = 0; // 记录请求队列数目
bool client = false; // 是否有客户请求
// 算法实现
void ProtectServer()
{
while(1){ // 使服务端一直运行
if(1000 <= Clock_end) // 如果等待时间大于一秒
{
/* 处理当前等待队列的所有请求 */
Clock_start = clock(); // 记录当前时间
count = 0;
}
/* 接收客户端请求,有客户请求时,将client赋值为true */
if(client) // 如果有客户接入
{
if(count<10000) // 当前客户请求队列是否大于10000
{
count++; // 客户队列+1
/* 将客户端请求信息存储在请求队列 */
}
else // 请求队列满时抛出异常
{
/* 给服务器抛出满载异常 */
}
}
client = false; // 客户请求初始化
Clock_end = clock() - Clock_start; // 计算等待时间
}
}