科大讯飞校招笔试题及答案--C++

不一定对

一、科大讯飞2021校招提前批笔试(7.31)

根据记忆回忆
第一题:AC
第二题:0%
第三题:虽然AC,但后来发现还是错了
第四题:71%

第一题 买东西

你有1、5、10、50、100面值的人民币分别a、b、c、d、e张,输入k元,输出最少要掏几张人民币。如果不能凑够输出-1.
输入示例:55
输出示例:2

//思路:100-1元,一个一个试探,能花哪个花哪个
//缺点:要求题目的面额成倍数增加,这样就不需要回溯
//假如面额是3,2,k是4,各种面额数量都是2,就算不出来
#include <iostream>
#include <vector>
using namespace std;
int main()
{
	int a, b, c, d, e, k;
	cin >> a >> b >> c >> d >> e;
	cin >> k;
	int ret=0;
	while (k > 0) {
		if (e > 0 && k - 100 >= 0) {
			e--;
			k -= 100;
			ret++;
		}
		else if (d > 0 && k - 50 >= 0) {
			d--;
			k -= 50;
			ret++;
		}
		else if (c > 0 && k - 10 >= 0) {
			c--;
			k -= 10;
			ret++;
		}
		else if (b > 0 && k - 5 >= 0) {
			b--;
			k -= 5;
			ret++;
		}
		else if (a > 0 && k - 1 >= 0) {
			a--;
			k -= 1;
			ret++;
		}
		else {
			break;
		}
	}
	if (k == 0) {
		cout << ret;
	}
	else {
		cout << -1;
	}
	return 0;

}

第二题 排序

题干给出了经过每轮排序后数据的分布,要求写出相应的程序,我猜是快速排序,现场没做出来。
第一行输入数据个数,第二行输入数据。输出经过每轮排序后数据的情况。
输入示例:
输出示例:

//这是之后写的,可能是这样,我也不知道对不对
#include <iostream>
#include <vector>
using namespace std;

void display(vector<int> &array) {
	for (auto i : array) {
		cout << i << "  ";
	}
	cout << endl;
}
int getStandard(vector<int> &array, int i, int j) {
	int key = array[i];//基准数据 
	while (i < j) {
		while (i < j&&array[j] >= key) {
			j--;
		}
		if (i < j) {
			array[i] = array[j];
		}
		while (i < j&&array[i] <= key) {
			i++;
		}
		if (i < j) {
			array[j] = array[i];
		}
	}
	// 跳出循环时 i 和 j 相等, 此时的 i 或 j 就是 key 的正确索引位置
	//把基准数据赋给正确位置 
	array[i] = key;
	display(array);
	return i;
}
void quicksort(vector<int>&array, int begin, int end) {
	if (begin<end) {
		int standard = getStandard(array, begin, end);
		quicksort(array, begin, standard-1);
		quicksort(array, standard+1, end);
	}

}

int main() {
	int n;
	vector<int> array{ 49,38,65,97,76,13,27,49,10 };
	n = array.size();
	/*int in;
	cin >> n;
	for (int i = 0;i < n;i++) {
		cin >> in;
		array.push_back(in);
	}*/
	quicksort(array, 0, n - 1);
	display(array);
	return 0;
}

输出:
10 38 27 13 49 76 97 49 65
10 38 27 13 49 76 97 49 65
10 13 27 38 49 76 97 49 65
10 13 27 38 49 76 97 49 65
10 13 27 38 49 65 49 76 97
10 13 27 38 49 49 65 76 97
10 13 27 38 49 49 65 76 97

第三题 矩形相交

输出两个矩形各自对角线上的两个点,比如A矩形(0,0),(1,1)B矩形(2,2),(3,3)。则A矩形另外两个点为(0,1),(1,0),B矩形另外两个点为(2,3),(3,2).判断两个矩形是否相交。
输入示例:0 0 1 1 2 2 3 3
输出示例:0

//思路:判断一个矩形的点是否在另一个矩形。
//虽然AC了,但还是错的
//如果是0,0,3,3,1,-1,2,4。这种情况没有点在矩形内,但也是相交的
#include <iostream>
using namespace std;
bool between(int x, int y, int*A) {
	//判断(x,y)是否在矩形A中
	if (x >= A[0] && x <= A[2] || x >= A[2] && x <= A[0]) {
		if (y >= A[1] && y <= A[3] || y >= A[3] && y <= A[1]) {
			return true;
		}
	}
	return false;
}
bool check(int *A, int *B) {
	//判断A的四个点是否至少有一个在矩形B中
	if (between(A[0], A[1], B)) {
		return true;
	}
	if (between(A[0], A[3], B)) {
		return true;
	}
	if (between(A[2], A[1], B)) {
		return true;
	}
	if (between(A[2], A[3], B)) {
		return true;
	}
	return false;
}
int main() {
	int A[4];
	int B[4];
	for (int i = 0;i < 4;i++) {
		cin >> A[i];
	}
	for (int i = 0;i < 4;i++) {
		cin >> B[i];
	}
	if (check(A, B) || check(B, A)) {
		cout << 1;
	}
	else {
		cout << 0;
	}
	return 0;

}

第四题 读取字符串中的数字

输入一行字符串,输出字符串中的数字。
我写的有问题,不知道为啥只过了70%的测试用例。
推测1:可能是因为我这不停的输入,不能结束吧,因为他的要求是只读取一行。当时想用getline()函数可是怎么也想不起来另外一个参数是啥,唉,凉凉。
推测2:可能是要考虑正负数。
输入示例:#+0a19
输出示例:019

//错误示例:只过了71%测试用例
#include <iostream>
#include <string>
using namespace std;

int main() {
	string s;
	//cin >> s;
	while (cin >> s) {
		for (int i = 0;i < s.length();i++) {
			if (s[i] <= '9'&&s[i] >= '0') {
				int x = s[i] - '0';
				cout << x;
			}
		}
	}
	cout << endl;
	return 0;
}
//推测一对应的修改,也可能不对
#include <iostream>
#include <string>
using namespace std;

int main() {
	string s;
	getline(cin, s);//读取一行
	for (int i = 0;i < s.length();i++) {
		if (s[i] <= '9'&&s[i] >= '0') {
			int x = s[i] - '0';
			cout << x;
		}
	}
	cout << endl;
	return 0;
}

二、科大讯飞2020校招笔试题及答案

第一题:加法计数器

实现一个加法计数器,要求满足是任意大小的两个整数相加
输入描述:任意大小的两个整数
输出描述:相加的结果
输入示例:123456789987654321 987654321123456789
输出示例:1111111111111111110

#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main() {
	string a, b;
	cin >> a >> b;
	int len = a.length() > b.length() ? a.length() : b.length() + 1;
	vector<int> c(len);//尽量使用vector,用数组创建数组是长度要设置常量
	//这样也可以:但是在vs执行有问题
	//int *c = new int(a.length()>b.length()?a.length():b.length() + 1);
	int carrybit = 0;//进位
	int i = a.size() - 1, j = b.size() - 1, k = 0;
	int ai = 0, bj = 0;
	while (1) {
		if (i < 0 && j < 0) {
			break;
		}
		ai = 0, bj = 0;
		if (i >= 0) {
			ai = (a[i] - '0');
		}
		if (j >= 0) {
			bj = (b[j] - '0');
		}
		c[k] = (ai + bj + carrybit) % 10;
		carrybit = (ai + bj + carrybit) / 10;
		i--;j--;k++;
	}
	if (carrybit == 0) {
		k--;
	}
	else {
		c[k] = carrybit;
	}
	for (int i = k;i >= 0;i--) {
		cout << c[i];
	}
	cout << endl;
	return 0;
}

第二题:压缩字符串

将任意长度的字符串按下列规则压缩并输出
规则:相同连续的字
符,则压缩为“数字个数 + 字符”,如aaabb输出3a2b
输入示例:aabb
输出示例:2a2b
备注:单个不压缩,如abcdba,输入不包含数字和转义字符

#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main() {
	string s;
	vector<char> output(s.length());
	cin >> s;
	for (int i = s.length() - 1;i >= 0;i--) {
		output.push_back(s[i]);
		if (i - 1 >= 0 && s[i] == s[i - 1]) {
			output.push_back('1');
			while (i - 1 >= 0 && s[i] == s[i - 1]) {
				output.back()++;
				i--;
			}
		}
	}
	for (int i = output.size() - 1;i >= 0;i--) {
		cout << output[i];
	}
}

三、科大讯飞2019秋招笔试题

第一题:改成绩

华老师的n个学生参加了一次模拟测验,考出来的分数很糟糕,但是华老师可以将成绩修改为[0,100]中的任意值,所以他想知道,如果要使所有人的成绩的平均分不少于X分,至少要改动多少个人的分数?

输入
第一行一个数T,共T组数据(T≤10)
接下来对于每组数据:
第一行两个整数n和X。(1≤n≤1000, 0≤X≤100)
第二行n个整数,第i个数Ai表示第i个学生的成绩。(0≤Ai≤100)

输出
共T行,每行一个整数,代表最少的人数。
样例输入
2
5 60
59 20 30 90 100
5 60
59 20 10 10 100
样例输出
1 2

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main() {
	int T;
	cin >> T;
	while (T--) {
		int n, X;
		cin >> n >> X;
		vector<int> grade;
		int g,sum=0;
		//输入+求和
		for (int i = 0,in;i < n;i++) {
			cin >> g;
			sum += g;
			grade.push_back(g);
		}
		//排序
		sort(grade.begin(), grade.end(), less<int>());
		//从小到大修改成绩
		int differ = X * n - sum;
		int i = 0;
		while (differ > 0) {
			differ = differ - (100 - grade[0]);
			i++;
		}
		cout << i << "  ";

	}
}

第二题:杀手

有n个杀手排成一行,每个杀手都有一个不同的编号(编号为1-n),在每个夜晚,杀手都会行动,如果某个杀手编号大于他右边的杀手的编号,他就会杀死他右边的杀手,杀手是的行动是瞬间的,因此一个人可能某一个夜晚既杀死了别人又被别人杀死,例如3,2,1这个顺序,在第一个夜晚2会杀死1,同时3也会杀死2。显而易见,一段时间之后,就不会有人杀或被杀,平安夜也就到来了,请问在平安夜之前有多少个夜晚。

输入
输入第一行是一个整数n(1≤n≤100000),表示杀手的数量。
接下来一行有n个数,是一个1-n的全排列。

输出
输出包含一个整数,表示平安夜之前经历了多少个夜晚。

样例输入
10
10 9 7 8 6 5 3 4 2 1
样例输出
2

补充样例
输入样例2:
6
1 2 3 4 5 6
输出样例2 :
0

样例解释: 样例1中杀手的变化为[10 9 7 8 6 5 3 4 2 1]->[10 8 4]->[10],故答案为2。

#include <iostream>
#include <vector>
using namespace std;
int main() {
	int n;
	cin >> n;
	int night = 0;
	vector<int> killers;
	int in;
	for (int i = 0;i < n;i++) {
		cin >> in;
		killers.push_back(in);
	}
	bool tag = true;
	while (tag) {
		tag = false;
		//i指向被杀人,判断当前i是否要被杀
		//j指向新一轮杀手的结尾
		int j = 1;
		for (int i = 1;i < n;i++) {
			if (killers[i] > killers[i - 1]) {
				killers[j] = killers[i];
				j++;
			}
			else {
				tag = true;
			}
		}
		n = j;
		if(tag==true)
			night++;
	}
	cout << night << endl;

	return 0;
}

猜你喜欢

转载自blog.csdn.net/MAN_Sue/article/details/107691825
今日推荐