这一场是计算机视觉算法的。
评价
总体来讲,编程好答一些。总体来讲,不止编程题的机试都会开发向,建议计算机的理论知识也要备好。
选择题
题目记得不是很清了,包含内容很杂,计算机视觉理论、数据结构、计算机基础、数据库等知识都会考。
感觉有一个智力题目:一段绳子,裁两刀,变成3段,可以拼成一个三角形的概率有多大。(答案是1/4)
系统设计题
不大会。感觉这个题型最难准备,因为会是计算机视觉的一个子方向。不记得是哪个公司,相似题型考的是对视频的目标检测。
编程题
题目1
大意
统计字符串中easy出现次数。必须按照e a s y的顺序来(大小写都是可以的)。必须是完整出现的次数,中间其他字符不会计算在内。
样例
abcdesAssayEaaaassYyy
输出
2
代码
AC
比如样例统计到abcdesAssayEaaaassY就是2次,为了避免出现错误,每次while都加一个判断的bool变量,会显得臃肿,有大佬可以在评论区提供简洁的指导。
#include<iostream>
#include<string>
using namespace std;
int main(){
string str;
cin >> str;
int res = 0, index = 0;
while(index < str.size()){
bool flage = false,flaga = false, flags= false, flagy = false;
while(index < str.size() && str[index] != 'e' && str[index] != 'E' ) index++;
if(str[index] == 'e'|| str[index] == 'E' ){
flage = true;
index++;
}
while(index < str.size() && str[index] != 'a' && str[index] != 'A' ) index++;
if(str[index] == 'a'|| str[index] == 'A' ){
flaga = true;
index++;
}
while(index < str.size() && str[index] != 's' && str[index] != 'S' ) index++;
if(str[index] == 's'|| str[index] == 'S' ){
flags = true;
index++;
}
while(index < str.size() && str[index] != 'y' && str[index] != 'Y' ) index++;
if(str[index] == 'y'|| str[index] == 'Y' ){
flagy = true;
index++;
}
if(flage && flaga && flags && flagy)res++;
// cout << str.substr(0, index)<<'\n';
}
cout << res;
}
题目2
大意
小明领导一只队伍,手下n个士兵,第i个士兵攻击为a[i],防守为b[i]。选择士兵,使得攻击力和防守力之和最大,同时要保证攻击力和不小于0,攻击力和不小于0。如果没有符合条件的,就小明上,小明的攻击和防守均是0。输出最后安排的队伍的攻击力与防守力之和。
,攻击力和防守力都在[-1000,1000]范围内。
样例
5
-5 7
8 -6
6 -3
2 1
0 1
输出
8
代码
通过90%,不知道还有什么点没有注意到。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
bool cmp(vector<int> v1, vector<int> v2){
if(v1[2] == v2[2]) {
bool flag1= v1[0] > 0, flag2= v1[1] > 0,flag3= v2[0] > 0, flag4= v2[1] > 0;
int res1 = flag1 + flag2, res2 = flag3 + 4;
return res1 >= res2;
}
else return v1[2] >= v2[2];
}
int main(){
int n;
cin >> n;
vector<vector<int>> value(n, vector<int>(3));
for(int i = 0; i < n; i++){
cin >> value[i][0] >> value[i][1];
value[i][2] = value[i][0] + value[i][1];
}
sort(value.begin(), value.end(),cmp);
int sum = 0, sum1 = 0, sum2 = 0, ans = 0;
if(value[0][2] < 0) return 0;
for(int i = 0; i < n;i++){
if(value[i][2] < 0 && value[i][1] < 0 && value[i][0] < 0) break;
sum += value[i][2],sum1 += value[i][0],sum2 += value[i][1];
if(sum1 >= 0 && sum2 >= 0){
if(sum > ans) ans = sum;
}
}
cout << ans;
return 0;
}