华为2016校园招聘上机笔试题

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

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值