2016校园招聘上机笔试题
踩的坑:
Q 1 5: 在测试样例中有可能 a= 1>b=5, 而题目样例并没有体现这一点
用法记录:
vector chengji:最大值的求法
cout<<*max_element(stu.begin()+a-1,stu.begin()+b)<<endl;
#include <algorithm>
#include <vector>
#include <iostream>
#include <string>
using namespace std;
int main()
{
int N,M;
while(cin>>N>>M){
vector<int> stu(N);
int a,b;char c;
for(int i=0;i<N;++i)cin>>stu[i];
for(int j=0;j<M;++j){
cin>>c>>a>>b;
if(c=='Q'){
if(a>b)swap(a,b);
cout<<*max_element(stu.begin()+a-1,stu.begin()+b)<<endl;
}
if(c=='U')stu[a-1]=b;
}
}
return 0;
}
踩的坑:
'\'要写成'\\'
用法记录:
字符string的查找:
rfind(), find()
字符的erase(),传参同substr()
stable_sort()
// 记录最多8条错误记录
// 合并错误记录:文件名 行数 同 计数累加
#include <string>
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;
bool compare(pair<string, int> a, pair<string, int> b)
{
return a.second > b.second;
}
int main()
{
string input, file;
vector<pair<string, int>> errors;
while (getline(cin, input))
{
if (input.size() == 0)
break;
// 转义字符,字符的rfind
// E:\V1R2\product\fpgadrive.c 1325
unsigned int f = input.rfind('\\');
// file=fpgadrive.c 1325
file = input.substr(f + 1);
// pair的运用,make pair入vector
errors.push_back(make_pair(file, 1));
// 去重
for (int i = 0; i < (errors.size() - 1); i++)
{
// 每次入vector的一条新file,和之前的比较,若重复就pop_back()
if (errors[i].first == file)
{
errors[i].second++;
errors.pop_back();
break;
}
}
}
// errors全部存储号,现在开始按照错误多少排序
// stable_sort的作用:
// 1.按照错误多的排前面
// 2.错误等的,按照push_back()的顺序/相对顺序保持不变,这是和sort比的优势
stable_sort(errors.begin(), errors.end(), compare);
// 然后输出前面8条,且文件名字太多要删除
int idx = 0;
while (idx < 8 && errors.size())
{
string check = errors[idx].first;
int t = check.find(' ');
if (t > 16)
{
errors[idx].first.erase(0, t - 16); // 长度大于18前面的抹掉
}
cout << errors[idx].first << ' ' << errors[idx].second << endl;
idx++;
}
return 0;
}
扑克牌的大小
主要解题思路:
问题1:如何分辨两组牌是否为同一个类型?
答案1:可以通过输入字符串的间隔符(空格数)是否相同判断。
问题2:如何判断单个牌的大小顺序?
答案2:组一个字符串“345678910JQKA2jokerJOKER”,通过判断对应单个字符或字符串在该字符串的位置进行大小比较。
手牌比较过程:
手牌的类型相同(单对单,对对对,三对三,四对四,顺子对顺子):
a. 直接比较第一张手牌的大小即可;
手牌的类型不同(分为三种情况):
a. 存在王炸,输出王炸;
b. 存在炸弹,输出炸弹;
c. 否则输出ERROR;
用法记录:
string:
find()与substr()可以在某种程度上实现split()功能
count功能
// 输入手牌:个子、对子、顺子、三个、炸弹、对王中的一种
#include <iostream>
#include <algorithm>
using namespace std;
int main(){
string tb="345678910JQKA2jokerJOKER";
string s;
while(getline(cin, s)){
int idx=s.find('-'); // 返回的是数组索引号
string t1 = s.substr(0, idx);
string t2 = s.substr(idx+1);
// 可以通过输入字符串的间隔符(空格数)是否相同判断
int c1 = count(t1.begin(), t1.end(), ' ');
int c2 = count(t2.begin(), t2.end(), ' ');
if(c1!=c2){
if(t1=="joker JOKER" || t2=="joker JOKER"){
cout << "joker JOKER" << endl;
}
else if(c1==3){
cout << t1 << endl;
}
else if(c2==3){
cout << t2 << endl;
}
else{
cout << "ERROR" << endl;
}
}
else{
// 防止只有一个字符
string s1 = t1 + ' ', s2 = t2 + ' ';
s1=s1.substr(0, s1.find(' '));
s2 = s2.substr(0, s2.find(' '));
// 如果是"10"的话,他们也会找到一个索引位置
int i1=tb.find(s1);
int i2 = tb.find(s2);
if(i1>i2){
cout<<t1<<endl;
}
else{
cout <<t2 << endl;
}
}
}
return 0;
}
2016研发工程师编程题
主要思路:
用队列实现循环的删除
//0 1 2 3 4 5 6 7
// 0 1 3 4 6 7
// 用队列模拟,队首取数,用一个计数器计数,隔2个删一个,其他的重新放到队尾
#include <iostream>
#include <queue>
using namespace std;
int main()
{
int n;
while (cin >> n)
{
queue<int> q;
for (int i = 0; i < n; i++)
{
q.push(i);
}
// count 计数
int count = 0;
while (q.size() != 1)
{
if (count != 2)
{
int b = q.front();
q.pop();
q.push(b);
count++;
}
else
{
q.pop();
count = 0;
}
}
int c = q.front();
cout << c << endl;
}
return 0;
}
其他华为笔试题:
01