秋招笔试题:
1.有一对兔子,从出生后第4个月就每月生一对兔子,这对小兔子长到第四个月又每个月生一对兔子,假设兔子都不死。编写一个程序求N个月后兔子的总对数。
#define _CRT_SECURE_NO_WARNINGS
#include
using namespace std;
//此方法为利用递归实现
int Fibo(int n) //定义Fibo函数
{
if (n == 1)return 1;//第一个数字为1
if (n == 2)return 1;//第二个数字为1
if (n == 3)return 1;
if (n > 3)//从第三个数开始,每一个数是前两个数的和
{
return Fibo(n - 1) + Fibo(n - 3);//隔4月生一对,是Fibo(n-3)隔3个月生,是Fibo(n-2)
}
}
int main()
{
int n, num;
cout << "please input n:";
cin >> n;//输入要打印的斐波拉契数列的个数(从第一个数开始的)
num = Fibo(n);//调用Fibo函数
cout << "第" << n << "个月有" << num << "对兔子" << endl;
system("pause");
return 0;
}
中兴:
2.某公司有N名员工,给定所有员工工资的清单,财务人员要按照特定的顺序排列员工的工资。他按照工资的频次降序排列,即给定清单中所有频次较高的工资在频次较低的工资之前出现。如果相同数量相同的员工有相同的工资,则将按照给定清单中该工资第一次出现的顺序排列。
写一个算法帮助财务人员排列员工工资的顺序。
输入: [10000, 20000, 40000, 30000, 30000, 70000, 70000, 70000,
30000, 40000, 20000, 50000, 50000, 50000, 50000, 60000,
60000, 40000, 40000, 60000, 70000, 80000, 90000, 100000 ]
输出: [ 40000, 40000, 40000, 40000, 70000, 70000, 70000, 70000,
50000, 50000, 50000, 50000, 30000, 30000, 30000, 60000,
60000, 60000, 20000, 20000, 10000, 80000, 90000, 100000] ]
#include
#include
#include
3、
维克多博士创造了一个裂变反应堆,可取用处于液体状态的放射性物质。反应堆的容量是V加仑。他有N瓶的放射性液体,每个都有一定的质量和一定的体积。当液体倒入反应堆时,也产生一些单位的能量。现在,维克多想要将能量输出最大化。但是,有一个限制条件。他研究了原子元素的物理知识和历史,认识到反应堆内放射性液体的总量不能超过特定的临界质量M,否则反应就会失控,并引发剧烈的爆炸。写一个算法,帮助他从反应堆获得最大的能量,而不会让他丢掉性命。
输入:
该函数/方法的输入包括六个参数------
reactorCap,一个整数,表示反应堆的容量(V);
numberOfRadLiquid,一个整数,表示现有小瓶的数量(N);
criticalMass,一个整数,表示反应堆的最大临界质量(M);
volumes,一个整数列表,按顺序表示N份放射性液体的体积;
masses,一个整数列表,按顺序表示N份放射性液体的质量;
energies,一个整数列表,按顺序表示N份放射性液体产生的能量。
输出:
返回一个整数,表示可给定的约束条件下从反应堆中产生的最大能量。
示例:
输入:
reactorCap=100,numberOfRadLiquid=5,criticalMass=15,volumes=[50,40,30,20,10],masses=[1,2,3,9,5],energies=[300,480,270,200,180]
输出:
960
解释:
选择1、2、5号瓶中的液体,产生的能量=300+480+180=960.
4、华为机试-2019年8月28
第一题:报文转义:
如果报文中出现0x0A,转义成2个字节0x12 0x34,如果出现0x0B的话,转义成0xAB 0xCD,其他维持不变
输入报文为16进制(加红是因为这边设了一个坑。。最后AC20%也是这个原因)输入的报文第一个字节是
报文长度,报文长度这个字节也属于报文的一个部分,但是不参与转换的,输入的每个报文是用空格隔开的
要求:输出的报文的是大写的16进制,前面不用加前缀0x;也用空格隔开;
测试用例:
输入
8 1 2 3 4 5 6 A
输出
9 1 2 3 4 5 6 12 34
#include
#include
#include
#include
using namespace std;
//T类型转换为string
template
string T_to_string(T ch)
{
string str;
stringstream stream;
stream << ch;
str = stream.str();
return str;
}
int main(void)
{
vector vect; //输入的字符串
vector ret;//输出的字符串
string s;
记录输入字符的长度
while (cin >> s)
{
vect.push_back(s);
//count++;
}
string str;
int size = vect.size();
int count = size;
//int len = vect[0] - '0'; //数组的长度
//int count = len; //用来返回记录字符串的长度
//ret.push_back("0");//返回结果数组的第0位,最后修改
for (int i = 0; i < size; i++)
{
if (vect[i] == "A") //如果是A,那么放入 12 和 34 ,字符串长度+1
{
//cout << "-----" << endl;
ret.push_back("12");
ret.push_back("34");
//cout << ret[2] << endl;
count++;
}
else if (vect[i] == "B") //如果是B,那么放入 AB 和 CD ,字符串长度 + 1
{
ret.push_back("AB");
ret.push_back("CD");
count++;
}
else //如果不是A或B,不变
{
ret.push_back(vect[i]);
}
}
string str = T_to_string(count);
ret[0] = str;
for (int i = 0; i < ret.size(); i++)
{
cout << ret.at(i) << " ";
}
system("pause");
return 0;
}
第二题:找质数再求和
描述:给一个范围 [ low, high),要求找到这个范围内的所有质数,在比较这些质数十位数之和与个位数之和的较小值,输出最小值
测试用例:
输入:151 160
输出:8
因为151-159只有151和157两个质数,十位数是5+5 =10,个位数是1+7等于8,输出比较小的,所以是8
#include
#include
using namespace std;
#define max 100
//判断是否为质数
int judge(int n)
{
if (n < 2) return 0;
if (n == 2) return 1;
if (n % 2 == 0) return 0;
int sq = sqrt(n);
for (int i = 3; i <= sq; i += 2)
{
if (n%i == 0)
return 0;
}
return 1;
}
int main(void)
{
int low, high;
cin >> low >> high;
int push[max];
int count = 0;
int left = 0, right = 0;
for (int i = low; i < high; i++)
{
if (judge(i))
{
push[count++] = i;
}
}
for (int i = 0; i < count; i++)
{
right += push[i] % 10; //个位数之和
left += (push[i] / 10) % 10; //十位数之和
}
if (left < right)
cout << left << endl;
else
cout << right << endl;
system("pause");
return 0;
}
第三题:消息传递问题
描述:有M个群,给定一个人,这个人会把一条消息发送到他所在的所有群中,之后,群里面的每个人又会把消息再次转发到他所在的所有群中,直到所有群的所有人都转发过一次后,问最后又几个人能收到该消息;
输入:
发消息的那个人人名
群组的个数M
第一个群所有成员名称
第二个群所有成员名称
.................
第M个群所有成员名称
人名都是由英文字母组成的字符串,一个群中的所有人名用逗号相隔,
输出:最后一个有多少人收到了消息,包括第一个发消息的人,一个人重复收到消息,只算一次;
测试用例:
输入
Jack
3
Jack,Tom,Anny,Lucy
Tom,Danny
Jack,Lily
输出 6(表明有6个人最终会收到消息)