华为笔试(8.21)
第一题题意:给你一串字符串(数字和字母),把里面的A字母和B字母替换掉,然后输出替换后的字符串和长度,里面的数字都是16进制。就是A转换为12和34,B转换为AB和CD,这里都没问题,就是每个字符串第一个字符表示这个字符长度,这个长度要用16进制表示。
第一次提交20%,后面把第一位改成16进制就a了,(调了半个小时😓)
#include <iostream>
#include <vector>
#include <sstream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <unordered_map>
using namespace std;
string change(int n)
{
string s = "";
int y = 0;
while(n > 0)
{
y = n % 16;
if(y < 10)
s = char('0' + y) + s;
else
s = char('A' - 10 + y) + s;
n = n / 16;
}
return s;
}
int main()
{
string s;
vector<string> str;
getline(cin, s);
string ch;
stringstream ss(s);
while(ss >> ch)
{
str.push_back(ch);
}
vector<string> res;
res.push_back(str[0]);
for(int i = 1; i < str.size(); ++i)
{
if(str[i] != "A" && str[i] != "B")
{
res.push_back(str[i]);
}
else if(str[i] == "A")
{
res.push_back("12");
res.push_back("34");
}
else if(str[i] == "B")
{
res.push_back("AB");
res.push_back("CD");
}
}
int n = res.size();
res[0] = change(n);
for(int i = 0; i < res.size(); ++i)
cout << res[i] << " ";
cout << endl;
return 0;
}
第二题题意:给你一个区间,求出这个区间内的所有素数十位数和,个位数和之间的较小值。
筛选法,比较简单。 #include <iostream>
#include <vector>
#include <sstream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <unordered_map>
using namespace std;
vector<int> num(10000, 0);
void prime()
{
num[0] = 1;
num[1] = 1;
for(int i = 2; i < 10000; ++i)
{
if(num[i] == 0)
{
for(int j = 2 * i; j < 10000; j+=i)
{
num[j] = 1;
}
}
}
}
int main()
{
prime();
int low, high;
vector<int> numof1;
vector<int> numof10;
cin >> low >> high;
for(int i = low; i < high; ++i)
{
if(num[i] == 0)
{
numof1.push_back(i%10);
numof10.push_back(i/10%10);
}
}
int sumof1 = 0, sumof10 = 0;
for(int i = 0; i < numof1.size(); ++i)
{
sumof1 += numof1[i];
}
for(int i = 0; i < numof10.size(); ++i)
{
sumof10 += numof10[i];
}
cout << min(sumof1, sumof10) << endl;
return 0;
}
第三题题意:给你一个人名(字符串),和几个群组(包含人名),每个人都给所在群组的人发消息,问最终多少个人可以收到消息。
第三题:只过了10%,求思路。
查看5道真题和解析
