华为机试真题练习汇总(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")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值