机考在线训练题解析

机考在线训练题解析

在华为机试题库中,很多题目都是字符串处理相关的基础算法题。本文将详细解析涵盖字符串加解密、字符串合并处理、单词倒排三个问题。每个题目都附带思路讲解与完整代码,适合新手学习。

题目29:字符串加解密

题目描述

编写程序实现对字符串的加解密功能:

  • 加密规则

    • 英文字母用其后一个字母替换,且需要区分大小写

      • A → B,Z → a
      • a → B,z → A
    • 数字加1,9变为0

    • 其他字符保持不变

  • 解密规则

    • 与加密相反:

      • B → a,A → z
      • 0 → 9
      • 其他字符保持不变

要求实现两个函数:

  • encrypt(string s)
  • decrypt(string s)

解题思路

  1. 遍历输入字符串,逐个字符处理。

  2. 对于字母:

    • 小写字母加密后变成大写字母(往后移一位)
    • 大写字母加密后变成小写字母(往后移一位)
    • 遇到边界(如 z 或 Z)时要循环。
  3. 对于数字:

    • 0 → 19 → 0
  4. 其他字符保持不变。

  5. 解密过程与加密完全对称。


代码实现(详细注释)

#include <iostream>
#include <string>
using namespace std;

// 加密函数
string encrypt(const string& str) {
    string res;
    for (char c : str) {
        if (c >= 'a' && c <= 'z') {  
            // 小写字母 → 下一位大写字母
            res += (c == 'z' ? 'A' : char(c + 1 - 32));
        } else if (c >= 'A' && c <= 'Z') {  
            // 大写字母 → 下一位小写字母
            res += (c == 'Z' ? 'a' : char(c + 1 + 32));
        } else if (c >= '0' && c <= '9') {  
            // 数字 → 加1,9变成0
            res += (c == '9' ? '0' : char(c + 1));
        } else {
            // 其他字符不变
            res += c;
        }
    }
    return res;
}

// 解密函数
string decrypt(const string& str) {
    string res;
    for (char c : str) {
        if (c >= 'a' && c <= 'z') {  
            // 小写字母 → 前一位大写字母
            res += (c == 'a' ? 'Z' : char(c - 1 - 32));
        } else if (c >= 'A' && c <= 'Z') {  
            // 大写字母 → 前一位小写字母
            res += (c == 'A' ? 'z' : char(c - 1 + 32));
        } else if (c >= '0' && c <= '9') {  
            // 数字 → 减1,0变成9
            res += (c == '0' ? '9' : char(c - 1));
        } else {
            res += c;
        }
    }
    return res;
}

int main() {
    string s;
    while (getline(cin, s)) {  
        // 输出加密结果
        cout << encrypt(s) << endl;
        // 输出解密结果
        cout << decrypt(s) << endl;
    }
    return 0;
}

题目30:字符串合并处理

题目描述

输入两个字符串,进行如下操作:

  1. 将两个字符串合并。
  2. 将合并后的字符串分成奇数位和偶数位两个部分,分别排序。
  3. 将排序后的奇数位和偶数位重新合并。
  4. 对合并结果中的字符,如果它是 0-9A-Fa-f,则将其转为16进制数并进行 二进制位倒序,再转换回字符。

解题思路

  1. 合并两个字符串 → merged
  2. 遍历 merged,分成 odd(奇数位)和 even(偶数位)。
  3. oddeven 分别排序。
  4. 按原顺序合并回来。
  5. 遍历新字符串,对 0-9A-Fa-f 的字符进行 16进制 → 二进制 → 倒序 → 新字符 的转换。

示例

输入:

dec fab

合并:decfab
奇数位:dca → 排序:acd
偶数位:efb → 排序:bef
合并:abcdef

16进制倒序后 → 5D37BF


代码实现(详细注释)

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <cctype>
using namespace std;

// 将16进制字符转换成倒序后的字符
char reverseHex(char c) {
    int val;
    if (c >= '0' && c <= '9') val = c - '0';
    else if (c >= 'A' && c <= 'F') val = c - 'A' + 10;
    else if (c >= 'a' && c <= 'f') val = c - 'a' + 10;
    else return c;  // 非16进制字符直接返回

    // 将val转换成4位二进制并倒序
    int rev = 0;
    for (int i = 0; i < 4; i++) {
        rev = (rev << 1) | (val & 1);
        val >>= 1;
    }

    // 转换回16进制字符(大写)
    if (rev < 10) return rev + '0';
    else return rev - 10 + 'A';
}

int main() {
    string s1, s2;
    while (cin >> s1 >> s2) {
        string merged = s1 + s2;

        // 分离奇数位和偶数位
        string odd, even;
        for (int i = 0; i < merged.size(); i++) {
            if (i % 2 == 0) even += merged[i]; // 下标从0开始
            else odd += merged[i];
        }

        // 排序
        sort(odd.begin(), odd.end());
        sort(even.begin(), even.end());

        // 合并回去
        string sortedStr;
        int oi = 0, ei = 0;
        for (int i = 0; i < merged.size(); i++) {
            if (i % 2 == 0) sortedStr += even[ei++];
            else sortedStr += odd[oi++];
        }

        // 进行16进制字符倒序处理
        for (char &c : sortedStr) {
            c = reverseHex(c);
        }

        cout << sortedStr << endl;
    }
    return 0;
}

题目31:单词倒排

题目描述

输入一句话,将单词倒序输出。

要求:

  • 单词由 26个字母 组成。
  • 非字母字符(如空格、标点)都视为分隔符
  • 输出时,单词之间只保留一个空格。

解题思路

  1. 遍历字符串,将非字母的地方替换成空格。
  2. 按空格切分单词,存入 vector
  3. 倒序输出 vector 中的单词。

示例

输入:

I am a student.

输出:

student a am I

代码实现(详细注释)

#include <iostream>
#include <string>
#include <vector>
#include <sstream>
using namespace std;

int main() {
    string line;
    // 读取整行输入
    getline(cin, line);
    stringstream ss(line);
    string temp;
    vector<string> words; // 存储单词
    while (getline(ss,temp,' ')) {
       
    

        words.push_back(temp);
        // 遍历字符串,提取单词
    }
        // 倒序输出
        for (int i = (int)(words.size()) - 1; i >= 0; i--) {
            cout << words[i];
            if (i > 0) cout << " ";  // 单词之间一个空格
        }
        cout << endl;
    return 0;
}

总结

  • 29题:考察了字符的加解密(字母/数字循环处理)。
  • 30题:考察字符串合并、奇偶分离排序以及16进制位倒序。
  • 31题:考察单词提取与倒序输出,强调分隔符处理。

这三道题都非常经典,适合练习 字符串处理能力

内容概要:本文档详细介绍了一个基于MATLAB实现的跨尺度注意力机制(CSA)结合Transformer编码器的多变量时间序列预测项目。项目旨在精准捕捉多尺度时间序列特征,提升多变量时间序列的预测性能,降低模型计算复杂度与训练时间,增强模型的解释性和可视化能力。通过跨尺度注意力机制,模型可以同时捕获局部细节和全局趋势,显著提升预测精度和泛化能力。文档还探讨了项目面临的挑战,如多尺度特征融合、多变量复杂依赖关系、计算资源瓶颈等问,并提出了相应的解决方案。此外,项目模型架构包括跨尺度注意力机制模块、Transformer编码器层和输出预测层,文档最后提供了部分MATLAB代码示例。 适合人群:具备一定编程基础,尤其是熟悉MATLAB和深度学习的科研人员、工程师和研究生。 使用场景及目标:①需要处理多变量、多尺度时间序列数据的研究和应用场景,如金融市场分析、气象预测、工业设备监控、交通流量预测等;②希望深入了解跨尺度注意力机制和Transformer编码器在时间序列预测中的应用;③希望通过MATLAB实现高效的多变量时间序列预测模型,提升预测精度和模型解释性。 其他说明:此项目不仅提供了一种新的技术路径来处理复杂的时间序列数据,还推动了多领域多变量时间序列应用的创新。文档中的代码示例和详细的模型描述有助于读者快速理解和复现该项目,促进学术和技术交流。建议读者在实践中结合自己的数据集进行调试和优化,以达到最佳的预测效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

tt555555555555

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

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

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

打赏作者

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

抵扣说明:

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

余额充值