华为机试真题练习汇总(1~10)
华为机试真题练习汇总(1-10)
题目来源:华为机试 - 牛客
标记 * 号的代表有难度的题目。
HJ1 字符串最后一个单词的长度
描述
计算字符串最后一个单词的长度,单词以空格隔开,字符串长度小于5000。(注:字符串末尾不以空格为结尾)
输入描述:
输入一行,代表要计算的字符串,非空,长度小于5000。
输出描述:
输出一个整数,表示输入字符串最后一个单词的长度。
代码 1:
#include <iostream>
using namespace std;
int main() {
string s;
//cin>>s;
getline(cin, s);
int n = s.length(), i = n-1;
while(s[i]!=' ' && i>=0)
i--;
cout <<n-i-1<<endl;
return 0;
}
代码 2:
#include <iostream>
using namespace std;
int main() {
string s;
while(cin>>s);
cout<<s.length();
return 0;
}
HJ2 计算某字符出现次数
描述
写出一个程序,接受一个由字母、数字和空格组成的字符串,和一个字符,然后输出输入字符串中该字符的出现次数。(不区分大小写字母)
输入描述:
第一行输入一个由字母、数字和空格组成的字符串,第二行输入一个字符(保证该字符不为空格)。
输出描述:
输出输入字符串中含有该字符的个数。(不区分大小写字母)
代码:
#include <iostream>
using namespace std;
int main() {
string s;
//cin >> s;
getline(cin, s);
char c;
cin >> c;
for (char& x : s)
x = tolower(x);
c = tolower(c);
int count = 0;
for (char& ch : s)
if (ch == c)
count++;
cout << count << endl;
return 0;
}
// 64 位输出请用 printf("%lld")
HJ3 明明的随机数
描述
明明生成了N个1到500之间的随机整数。请你删去其中重复的数字,即相同的数字只保留一个,把其余相同的数去掉,然后再把这些数从小到大排序,按照排好的顺序输出。
输入描述:
第一行先输入随机整数的个数 N 。 接下来的 N 行每行输入一个整数,代表明明生成的随机数。 具体格式可以参考下面的"示例"。
输出描述:
输出多行,表示输入数据处理后的结果
代码:
#include <iostream>
#include <unordered_set>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
unordered_set<int> s;
int n, x;
cin >> n;
while (n--)
{
cin >> x;
s.insert(x);
}
vector<int> v;
for (auto it = s.begin(); it != s.end(); it++)
v.push_back(*it);
sort(v.begin(), v.end());
for (int& x : v)
cout << x << endl;
return 0;
}
// 64 位输出请用 printf("%lld")
HJ4 字符串分隔
描述
-
输入一个字符串,请按长度为8拆分每个输入字符串并进行输出;
-
长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。
输入描述:
连续输入字符串(每个字符串长度小于等于100)
输出描述:
依次输出所有分割后的长度为8的新字符串
代码:
#include <iostream>
using namespace std;
int main() {
string s;
cin >> s;
int n = s.length();
for (int i = 0; i <= n - 8; i += 8)
cout << s.substr(i, 8) << endl;
int last = n % 8;
if (last) {
int begin = n / 8 * 8;
string temp = s.substr(begin);
while (temp.size() < 8)
temp.push_back('0');
cout << temp << endl;
}
return 0;
}
// 64 位输出请用 printf("%lld")
HJ5 进制转换
描述
写出一个程序,接受一个十六进制的数,输出该数值的十进制表示。
输入描述:
输入一个十六进制的数值字符串。
输出描述:
输出该数值的十进制字符串。不同组的测试用例用\n隔开。
代码:
#include <cctype>
#include <cmath>
#include <iostream>
using namespace std;
int main()
{
string s;
cin >> s;
int n = s.length(), mi = 0;
long long ans = 0LL;
for (int i = n - 1; i >= 0; i--)
{
if (s[i] == 'x')
break;
int digit = 0;
if (isdigit(s[i]))
digit = s[i] - '0';
else
digit = 10 + s[i] - 'A';
ans += digit * (long long)pow(16, mi);
mi++;
}
cout<<ans<<endl;
return 0;
}
// 64 位输出请用 printf("%lld")
HJ6 质数因子
描述
功能:输入一个正整数,按照从小到大的顺序输出它的所有质因子(重复的也要列举)(如180的质因子为2 2 3 3 5 )
输入描述:
输入一个整数
输出描述:
按照从小到大的顺序输出它的所有质数的因子,以空格隔开。
代码:
#include <iostream>
using namespace std;
int main() {
long long num;
cin >> num;
for (int i = 2; i * i <= num; i++) {
if (num % i == 0) {
while (num % i == 0) {
cout << i << ' ';
num /= i;
}
}
}
if (num > 1)
cout << num << endl;
return 0;
}
// 64 位输出请用 printf("%lld")
HJ7 取近似值
描述
写出一个程序,接受一个正浮点数值,输出该数值的近似整数值。如果小数点后数值大于等于 0.5 ,向上取整;小于 0.5 ,则向下取整。
数据范围:保证输入的数字在 32 位浮点数范围内
输入描述:
输入一个正浮点数值
输出描述:
输出该数值的近似整数值
代码:
#include <iostream>
using namespace std;
int main() {
double input;
cin >> input;
int x = static_cast<int>(input);
if (input - x >= 0.5)
cout << x + 1 << endl;
else
cout << x << endl;
return 0;
}
// 64 位输出请用 printf("%lld")
HJ8 合并表记录
描述
数据表记录包含表索引index和数值value(int范围的正整数),请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照index值升序进行输出。
提示:
0 <= index <= 11111111
1 <= value <= 100000
输入描述:
先输入键值对的个数n(1 <= n <= 500)
接下来n行每行输入成对的index和value值,以空格隔开
输出描述:
输出合并后的键值对(多行)
代码:
#include <algorithm>
#include <iostream>
#include <unordered_map>
#include <vector>
using namespace std;
int main() {
int n;
cin >> n;
int index, value;
unordered_map<int, int> cnt;
for (int i = 0; i < n; i++) {
cin >> index >> value;
cnt[index] += value;
}
vector<pair<int, int>> vp;
for (auto &[idx, c] : cnt)
vp.emplace_back(make_pair(idx, c));
sort(vp.begin(), vp.end(),
[](const pair<int, int>& p1, const pair<int, int>& p2) {
return p1.first < p2.first;
});
for (auto& p : vp) {
cout << p.first << ' ' << p.second << endl;
}
return 0;
}
// 64 位输出请用 printf("%lld")
HJ9 提取不重复的整数
描述
输入一个 int 型整数,按照从右向左的阅读顺序,返回一个不含重复数字的新的整数。
保证输入的整数最后一位不是 0 。
输入描述:
输入一个int型整数
输出描述:
按照从右向左的阅读顺序,返回一个不含重复数字的新的整数
代码:
#include <iostream>
#include <string>
#include <unordered_set>
using namespace std;
int main() {
int input;
cin >> input;
string s = to_string(input);
int n = s.length();
int ans = 0;
unordered_set<int> us;
for (int i = n - 1; i >= 0; i--) {
int digit = s[i] - '0';
if (us.count(digit))
continue;
ans = 10 * ans + digit;
us.insert(digit);
}
cout << ans << endl;
return 0;
}
// 64 位输出请用 printf("%lld")
HJ10 字符个数统计
描述
编写一个函数,计算字符串中含有的不同字符的个数。字符在 ASCII 码范围内( 0~127 ,包括 0 和 127 ),换行表示结束符,不算在字符里。不在范围内的不作统计。多个相同的字符只计算一次
例如,对于字符串 abaca 而言,有 a、b、c 三种不同的字符,因此输出 3 。
输入描述:
输入一行没有空格的字符串。
输出描述:
输出 输入字符串 中范围在(0~127,包括0和127)字符的种数。
代码:
#include <iostream>
#include <unordered_set>
using namespace std;
int main() {
string s;
cin >> s;
unordered_set<char> us;
for (char& c : s)
us.insert(c);
cout << us.size() << endl;
return 0;
}
// 64 位输出请用 printf("%lld")