【GESP】C++三级练习 luogu-B3674 [语言月赛202210] 标题修改
GESP三级练习,字符串练习(C++三级大纲中6号知识点,字符串),难度★★☆☆☆。
luogu-B3674 [语言月赛202210] 标题修改
题目要求
题目描述
某 E 写了一篇文章,标题为字符串 $S$,由小写英文字符和空格组成。
某 E 恪守规范,因此,字符串 $S$ 是由若干个单词组成的,单词之间由一个空格隔开。
编辑人员要求将单词中的字母的大小写做调整。具体的,对每个单词,编辑人员要求将每个单词中的第奇数个字母改成大写,第偶数个字母改成小写。
关于单词下标的定义:这里我们以 $1$ 为起始下标。也就是说,对一个长度为 $n$ 的单词,我们将字母从头到尾记作第一个、第二个、$\cdots$、第 $n$ 个。
举例:对单词 $\texttt{apple}$
- 第一个字母为 $\texttt{a}$
- 第二个字母为 $\texttt{p}$
- 第三个字母为 $\texttt{p}$
- 第四个字母为 $\texttt{l}$
- 第五个字母为 $\texttt{e}$
某 E 要赶 ddl,请你帮她完成这个任务。
输入格式
输入一行一个字符串 $S$。
输出格式
输出一行一个字符串,代表修改后的标题。
输入输出样例 #1
输入 #1
1
i like eat apple
输出 #1
1
I LiKe EaT ApPlE
说明/提示
对于 $20\%$ 的数据,$|S|=1$;
对于另外 $30\%$ 的数据,标题仅由一个单词组成;
对于 $100\%$ 的数据,保证去除空格后的 $S$ 长度 $\le 10^6$。
如果想要使用 char
数组对整个 $S$ 进行存储,将数组大小调整至 $2 \times 10 ^ 6$ 以上即可。
题目分析
解题思路
- 读取一行字符串输入,存储到string变量中
- 遍历字符串,处理每个单词:
- 使用循环遍历字符串的每个字符
- 遇到非空格字符时,根据在单词中的位置决定大小写
- 奇数位置转大写,偶数位置转小写
- 遇到空格时重置单词内位置计数
- 字符大小写转换:
- 使用toupper()函数将字符转为大写
- 使用tolower()函数将字符转为小写
- 输出处理后的字符串
复杂度分析:
- 时间复杂度为 $O(n)$,其中n为输入字符串的长度
- 空间复杂度为 $O(1)$,只需要常数级额外空间存储计数器和修改后的字符串
示例代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
#include <string>
int main() {
// 定义字符串变量存储输入
std::string str;
// 读取一整行输入,包含空格
getline(std::cin, str);
// idx用于记录每个单词中字母的位置(1开始)
int idx = 1;
// 遍历整个字符串
for (int i = 0; i < str.length(); i++) {
// 如果当前字符不是空格
if (str[i] != ' ') {
// 奇数位置字母转大写
if (idx % 2 == 1) {
str[i] = toupper(str[i]);
}
// 偶数位置字母转小写
else {
str[i] = tolower(str[i]);
}
// 单词内字母位置加1
idx++;
}
// 遇到空格,重置单词内字母位置计数
else {
idx = 1;
}
}
// 输出处理后的字符串
std::cout << str;
return 0;
}
所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code
GESP各级别考纲要点、知识拓展和练习题目清单详见C++学习项目主页
“luogu-”系列题目已加入洛谷Java、C++初学团队,作业清单,可在线评测,团队名额有限,欢迎加入。
“bcqm-”系列题目可在编程启蒙题库进行在线评测。
本文由作者按照 CC BY 4.0 进行授权