华为OD机试 - 秘钥格式化 - 字符串处理(Python/JS/C/C++ 2025 A卷 100分)

在这里插入图片描述

华为OD机试 2025A卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。

一、题目描述

给定一个非空字符串 S,其被 N 个’-‘分隔成 N+1 的子串,给定正整数 K,要求除第一个子串外,其余的串每 K 个用’-‘分隔,并将小写字母转换为大写。

二、输入描述

正整数 K 和‘-’分割的字符串。

如:
2
25G3C-abc-d

三、输出描述

转换后的字符串。

四、测试用例

测试用例1:

1、输入

abc-def-ghijkl
2

2、输出

abc-DE-FG-HI-JK-L

3、说明

除第一个部分外,其余部分转换为大写并按每2个字符加 ‘-’ 分隔。

测试用例2:

1、输入

example-string-code
4

2、输出

example-STRI-NGCO-DE

3、说明

除第一个部分外,其余部分转换为大写并按每4个字符加 ‘-’ 分隔。

五、解题思路

给定一个非空字符串 S,其被 N 个’-‘分隔成 N+1 的子串,给定正整数 K,要求除第一个子串外,其余的串每 K 个用’-‘分隔,并将小写字母转换为大写。

  1. 字符串分割: 使用分隔符 - 对字符串进行分割,保留第一个子串作为结果的基础部分。
    • 在大部分语言中,字符串分割使用内置方法(如 split 或 strtok),因为其时间复杂度为 O(n)(其中 n 是字符串的长度)。
  2. 数据结构:使用数组或列表存储分割后的结果。
  3. 子串拼接与大写转换: 将分割后的子串(除第一个子串外)拼接成一个完整的字符串,并将其转换为大写。
    • 大写转换通常通过内置方法(如 toUpperCase 或 toupper),操作复杂度为 O(m)(其中 m 是所有需要处理的字符数)。
  4. 分组与格式化: 将剩余的字符串按照给定的分组大小K 进行分组。
    • 遍历字符串,按 K 个字符为一组添加到结果字符串中,同时在每组间加上 -。
  5. 数据结构:不需要额外复杂的数据结构,只需用字符串或动态拼接类对象(如 StringBuilder 或 List)。
  6. 结果输出: 将基础部分和格式化部分拼接后输出。

六、Python算法源码

# 秘钥格式化
def main():
    # 导入Scanner模拟器
    import sys
    input = sys.stdin.read
    data = input().split("\n")
    
    # 给定一个非空字符串 S
    S = data[0]
    # 给定正整数 K
    K = int(data[1])

    # 分割输入字符串
    arr = S.split("-")
    result = arr[0]  # 保留第一个子串

    # 拼接除第一个子串外的部分并转换为大写
    rest = ''.join(arr[1:]).upper()

    # 处理后续部分:按 K 分割并加上 '-'
    formatted = []
    for i in range(0, len(rest), K):
        formatted.append(rest[i:i + K])

    # 输出结果
    print(f"{result}-{'-'.join(formatted)}")

if __name__ == "__main__":
    main()

七、JavaScript算法源码

// 秘钥格式化
function main() {
    const readline = require('readline');
    const rl = readline.createInterface({
        input: process.stdin,
        output: process.stdout
    });

    let inputs = [];
    rl.on('line', function (line) {
        inputs.push(line);
        if (inputs.length === 2) {
            // 给定一个非空字符串 S
            let S = inputs[0];
            // 给定正整数 K
            let K = parseInt(inputs[1]);

            // 分割输入字符串
            let arr = S.split("-");
            let result = arr[0]; // 保留第一个子串

            // 拼接除第一个子串外的部分并转换为大写
            let rest = arr.slice(1).join("").toUpperCase();

            // 处理后续部分:按 K 分割并加上 '-'
            let formatted = [];
            for (let i = 0; i < rest.length; i += K) {
                formatted.push(rest.substring(i, i + K));
            }

            // 输出结果
            console.log(`${result}-${formatted.join("-")}`);
            rl.close();
        }
    });
}

main();

八、C算法源码

#include <stdio.h>
#include <string.h>
#include <ctype.h>

// 秘钥格式化
int main() {
    char S[101];
    int K;
    
    // 输入字符串 S
    scanf("%s", S);
    // 输入正整数 K
    scanf("%d", &K);
    
    char *token;
    char result[101] = "";
    char rest[101] = "";
    
    // 分割输入字符串
    token = strtok(S, "-");
    strcpy(result, token); // 保留第一个子串

    // 拼接除第一个子串外的部分并转换为大写
    while ((token = strtok(NULL, "-")) != NULL) {
        for (int i = 0; token[i] != '\0'; i++) {
            rest[strlen(rest)] = toupper(token[i]);
        }
    }

    // 处理后续部分:按 K 分割并加上 '-'
    char formatted[201] = "";
    for (int i = 0; i < strlen(rest); i++) {
        if (i % K == 0 && i > 0) {
            strcat(formatted, "-");
        }
        char c[2] = {rest[i], '\0'};
        strcat(formatted, c);
    }

    // 输出结果
    printf("%s-%s\n", result, formatted);
    
    return 0;
}

九、C++算法源码

#include <iostream>
#include <string>
#include <cctype>

using namespace std;

// 秘钥格式化
int main() {
    string S;
    int K;

    // 输入字符串 S
    cin >> S;
    // 输入正整数 K
    cin >> K;

    // 分割输入字符串
    size_t pos = S.find("-");
    string result = S.substr(0, pos); // 保留第一个子串
    string rest;

    // 拼接除第一个子串外的部分并转换为大写
    while (pos != string::npos) {
        size_t next_pos = S.find("-", pos + 1);
        string part = S.substr(pos + 1, next_pos - pos - 1);
        for (char c : part) {
            rest += toupper(c);
        }
        pos = next_pos;
    }

    // 处理后续部分:按 K 分割并加上 '-'
    string formatted;
    for (size_t i = 0; i < rest.size(); i++) {
        if (i > 0 && i % K == 0) {
            formatted += "-";
        }
        formatted += rest[i];
    }

    // 输出结果
    cout << result << "-" << formatted << endl;

    return 0;
}


🏆下一篇:华为OD机试真题 - 简易内存池(Python/JS/C/C++ 2025 A卷 200分)

🏆本文收录于,华为OD机试真题(Python/JS/C/C++)

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

哪 吒

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

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

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

打赏作者

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

抵扣说明:

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

余额充值