文章

【GESP】C++三级练习 luogu-B2117 整理药名

GESP三级练习,字符串练习(C++三级大纲中6号知识点,字符串),难度★★☆☆☆。

luogu-B2117 整理药名

题目要求

题目描述

医生在书写药品名的时候经常不注意大小写,格式比较混乱。现要求你写一个程序将医生书写混乱的药品名整理成统一规范的格式,即药品名的第一个字符如果是字母要大写,其他字母小写。

如将 ASPIRIN 、 aspirin 整理成 Aspirin。

输入格式

第一行一个数字 $n$,表示有 $n$ 个药品名要整理,$n$ 不超过 $100$。

接下来 $n$ 行,每行一个单词,长度不超过 $20$,表示医生手书的药品名。

药品名由字母、数字和 - 组成。

输出格式

$n$ 行,每行一个单词,对应输入的药品名的规范写法。

输入输出样例 #1

输入 #1

1
2
3
4
5
4
AspiRin
cisapride
2-PENICILLIN
Cefradine-6

输出 #1

1
2
3
4
Aspirin
Cisapride
2-penicillin
Cefradine-6

题目分析

解题思路

  1. 题目要求规范化药品名称的大小写格式。

  2. 规范化规则分析:
    • 第一个字母需要大写
    • 其余字母需要小写
    • 数字和特殊字符(如”-“)保持不变
  3. 具体思路:
    • 读入药品数量n和n个药品名
    • 对每个药品名进行处理:
      • 检查第一个字符,如果是字母则转换为大写
      • 将剩余字符中的字母转换为小写
      • 数字和特殊字符保持原样
    • 输出处理后的结果
  4. 时间复杂度分析:
    • 需要遍历每个药品名的每个字符,O(n*m)
    • 其中n为药品数量,m为药品名的最大长度
    • 空间复杂度为O(n*m),需要存储n个长度为m的字符串


示例代码

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
35
36
#include <cctype>
#include <iostream>
#include <string>

int main() {
    // 读入药品名数量
    int n;
    std::cin >> n;
    // 创建数组存储输入的药品名
    std::string str_ary[n];
    // 读入所有药品名
    for (int i = 0; i < n; i++) {
        std::cin >> str_ary[i];
    }
    // 创建数组存储规范化后的药品名
    std::string out_ary[n];
    // 处理每个药品名
    for (int i = 0; i < n; i++) {
        std::string cur_str = str_ary[i];
        // 如果第一个字符是小写字母,转换为大写
        if (std::islower(cur_str[0])) {
            cur_str[0] = std::toupper(cur_str[0]);
        }
        // 将剩余字符转换为小写
        for (int j = 1; j < cur_str.length(); j++) {
            cur_str[j] = std::tolower(cur_str[j]);
        }
        // 保存规范化后的药品名
        out_ary[i] = cur_str;
    }
    // 输出所有规范化后的药品名
    for (int i = 0; i < n; i++) {
        std::cout << out_ary[i] << std::endl;
    }
    return 0;
}

所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code

GESP各级别考纲要点、知识拓展和练习题目清单详见C++学习项目主页

luogu-”系列题目已加入洛谷Java、C++初学团队作业清单,可在线评测,团队名额有限,欢迎加入。

bcqm-”系列题目可在编程启蒙题库进行在线评测。

本文由作者按照 CC BY 4.0 进行授权