秋招笔试题汇总

 秋招笔试题:

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 
#include 
using namespace std;

//用来排序的结构体
typedef struct _CntOrder
{
	int count;  //保存工资出现的次数
	int order;  //保存工资第一次出现的顺序
}CntOrder;
typedef pair PAIR;
//比较仿函数
class mycompare
{
public:
	bool operator()(const PAIR& key1, const PAIR& key2)
	{
		if (key1.second.count != key2.second.count)
			return key1.second.count > key2.second.count;
		else
			return key1.second.order < key2.second.order;
	}
};

//得到按频次排列之后的工资数组
vector salary_frequeny(int num, int* salaries)
{
	mycompare cmp;
	vector ret;//存储最终得到的数组
	map salary; //定义map
	for (int i = 0; i < num; i++)
	{
		//没有找到该键值,说明第一次出现,将该值按照插入map,count=1,order=i;
		map::iterator it = salary.find(salaries[i]);
		if (it== salary.end())
		{
			CntOrder cnt;
			cnt.count = 1;
			cnt.order = i;
			salary.insert(PAIR(salaries[i],cnt));
		}
		//找到该键值,说明不是第一次出现,将该键值对应的count和order保存下来,删除该键值,count++,再进行插入
		else  
		{
			CntOrder cnt;
			cnt.count = it->second.count+1;
			cnt.order = it->second.order;
			salary.erase(it);//删除该键值
			salary.insert(PAIR(salaries[i], cnt));
		}
	}
	//将map里的元素拷贝到vect中
	vector vect(salary.begin(), salary.end());
	//将数组根据compare进行排序
	sort(vect.begin(), vect.end(), cmp);
	//将salary里的元素插入到ret中
	for (vector::iterator it = vect.begin(); it != vect.end(); it++)
	{
		for (int j = 1; j <= it->second.count; j++)
		{
			ret.push_back(it->first);
		}
	}
	return ret;
}
//打印数组
void print_vector(vector vect)
{
	cout << "[";
	for (vector::iterator it = vect.begin(); it != vect.end(); it++)
	{
		cout << *it << ",";
	}
	cout << "]" << endl;
}
int main(void)
{
	int arr[] = { 10000, 20000, 40000, 30000, 30000, 70000, 70000, 70000,
				  30000, 40000, 20000, 50000, 50000, 50000, 50000, 60000,
				  60000, 40000, 40000, 60000, 70000, 80000, 90000, 100000 };
	vector vect = salary_frequeny(24, arr);
	print_vector(vect);
	system("pause");
	return 0;
}

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个人最终会收到消息)
 

你可能感兴趣的:(秋招)