华为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 个用’-‘分隔,并将小写字母转换为大写。
- 字符串分割: 使用分隔符 - 对字符串进行分割,保留第一个子串作为结果的基础部分。
- 在大部分语言中,字符串分割使用内置方法(如 split 或 strtok),因为其时间复杂度为 O(n)(其中 n 是字符串的长度)。
- 数据结构:使用数组或列表存储分割后的结果。
- 子串拼接与大写转换: 将分割后的子串(除第一个子串外)拼接成一个完整的字符串,并将其转换为大写。
- 大写转换通常通过内置方法(如 toUpperCase 或 toupper),操作复杂度为 O(m)(其中 m 是所有需要处理的字符数)。
- 分组与格式化: 将剩余的字符串按照给定的分组大小K 进行分组。
- 遍历字符串,按 K 个字符为一组添加到结果字符串中,同时在每组间加上 -。
- 数据结构:不需要额外复杂的数据结构,只需用字符串或动态拼接类对象(如 StringBuilder 或 List)。
- 结果输出: 将基础部分和格式化部分拼接后输出。
六、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算法的适用场景,发现新题目,随时更新。