不一定对
一、科大讯飞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;
}
转载:https://blog.csdn.net/MAN_Sue/article/details/107691825