华为笔试(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%,求思路。