[语言月赛202210] 标题修改
题目描述
某 E 写了一篇文章,标题为字符串 S S S,由小写英文字符和空格组成。
某 E 恪守规范,因此,字符串 S S S 是由若干个单词组成的,单词之间由一个空格隔开。
编辑人员要求将单词中的字母的大小写做调整。具体的,对每个单词,编辑人员要求将每个单词中的第奇数个字母改成大写,第偶数个字母改成小写。
关于单词下标的定义:这里我们以 1 1 1 为起始下标。也就是说,对一个长度为 n n n 的单词,我们将字母从头到尾记作第一个、第二个、 ⋯ \cdots ⋯、第 n n n 个。
举例:对单词 apple \texttt{apple} apple
- 第一个字母为 a \texttt{a} a
- 第二个字母为 p \texttt{p} p
- 第三个字母为 p \texttt{p} p
- 第四个字母为 l \texttt{l} l
- 第五个字母为 e \texttt{e} e
某 E 要赶 ddl,请你帮她完成这个任务。
输入格式
输入一行一个字符串 S S S。
输出格式
输出一行一个字符串,代表修改后的标题。
样例 #1
样例输入 #1
i like eat apple
样例输出 #1
I LiKe EaT ApPlE
提示
对于 20 % 20\% 20% 的数据, ∣ S ∣ = 1 |S|=1 ∣S∣=1;
对于另外 30 % 30\% 30% 的数据,标题仅由一个单词组成;
对于 100 % 100\% 100% 的数据,保证去除空格后的 S S S 长度 ≤ 1 0 6 \le 10^6 ≤106。
如果想要使用 char
数组对整个 S S S 进行存储,将数组大小调整至 2 × 1 0 6 2 \times 10 ^ 6 2×106 以上即可。
方法1
解题思路:
本题要求我们对给定的标题字符串 S S S 进行修改,将每个单词中的奇数位置字母改成大写,偶数位置字母改成小写。我们可以按照以下步骤解决:
- 定义一个布尔变量
isOdd
,用于标记当前字母的位置是奇数还是偶数。初始值为true
,表示第一个字母的位置是奇数。 - 遍历字符串 S S S 的每个字符:
- 如果当前字符是空格,将
isOdd
重置为true
,表示下一个单词的第一个字母的位置是奇数。 - 如果当前字符是字母:
- 如果
isOdd
为true
,将当前字母转换为大写。 - 如果
isOdd
为false
,将当前字母转换为小写。 - 将
isOdd
取反,表示下一个字母的位置与当前字母相反。
- 如果
- 如果当前字符是空格,将
- 遍历完成后,得到修改后的标题字符串。
C++代码:
#include <iostream>
#include <string>
#include <cctype>
using namespace std;string modifyTitle(string S) {bool isOdd = true;for (char& c : S) {if (c == ' ') {isOdd = true;} else {if (isOdd) {c = toupper(c);} else {c = tolower(c);}isOdd = !isOdd;}}return S;
}int main() {string S;getline(cin, S);string modifiedTitle = modifyTitle(S);cout << modifiedTitle << endl;return 0;
}
代码解释:
- 定义函数
modifyTitle
,接受一个字符串S
作为参数,用于修改标题。 - 在函数内部,定义一个布尔变量
isOdd
,初始值为true
,表示第一个字母的位置是奇数。 - 使用范围循环遍历字符串
S
的每个字符c
。 - 如果当前字符
c
是空格,将isOdd
重置为true
,表示下一个单词的第一个字母的位置是奇数。 - 如果当前字符
c
是字母:- 如果
isOdd
为true
,使用toupper
函数将当前字母转换为大写。 - 如果
isOdd
为false
,使用tolower
函数将当前字母转换为小写。 - 将
isOdd
取反,表示下一个字母的位置与当前字母相反。
- 如果
- 遍历完成后,返回修改后的标题字符串
S
。 - 在
main
函数中,使用getline
函数读取一行输入,即标题字符串S
。 - 调用
modifyTitle
函数,将标题字符串S
作为参数传入,获取修改后的标题字符串modifiedTitle
。 - 输出修改后的标题字符串
modifiedTitle
。
复杂度分析:
- 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是字符串 S S S 的长度。我们需要遍历字符串一次。
- 空间复杂度: O ( 1 ) O(1) O(1)。我们只使用了常数级别的额外空间。
输入输出样例:
输入:
i like eat apple
输出:
I LiKe EaT ApPlE
该解决方案使用了一个布尔变量 isOdd
来标记当前字母的位置是奇数还是偶数。通过遍历字符串的每个字符,我们可以根据 isOdd
的值对字母进行大小写转换。遇到空格时,我们将 isOdd
重置为 true
,表示下一个单词的第一个字母的位置是奇数。这样,我们就可以正确地修改每个单词中字母的大小写。