文章

【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$ 以上即可。


题目分析

解题思路

  1. 读取一行字符串输入,存储到string变量中
  2. 遍历字符串,处理每个单词:
    • 使用循环遍历字符串的每个字符
    • 遇到非空格字符时,根据在单词中的位置决定大小写
    • 奇数位置转大写,偶数位置转小写
    • 遇到空格时重置单词内位置计数
  3. 字符大小写转换:
    • 使用toupper()函数将字符转为大写
    • 使用tolower()函数将字符转为小写
  4. 输出处理后的字符串

复杂度分析:

  • 时间复杂度为 $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 进行授权