题解:洛谷 P5733 自动修正

【题目来源】

洛谷:P5733 【深基6.例1】自动修正 - 洛谷(luogu.com.cn)

【题目描述】

大家都知道一些办公软件有自动将字母转换为大写的功能。输入一个长度不超过 \(100\) 且不包括空格的字符串。要求将该字符串中的所有小写字母变成大写字母并输出。

【输入】

输入一行,一个字符串。

【输出】

输出一个字符串,即将原字符串中的所有小写字母转化为大写字母。

【输入样例】

Luogu4!

【输出样例】

LUOGU4!

【核心思想】

  1. 问题分析:给定一个长度不超过 100 且不包含空格的字符串,要求将其中所有小写字母转换为大写字母,并输出转换后的字符串。这是一个基础的字符串遍历与字符变换问题,核心是利用 ASCII 码的规律进行大小写转换。

  2. 算法选择

    • 遍历 + ASCII 转换:遍历字符串的每个字符,若字符是小写字母(ASCII 码在 'a''z' 之间),则通过减去 'a' 再加上 'A' 将其转换为对应的大写字母。
    • 内置函数(备选):C++ 标准库提供了 toupper() 函数,可以直接将字符转换为大写。但本题旨在考察基础编程能力,使用 ASCII 计算更为常见。
  3. 关键步骤

    • 读入字符串:使用 cin >> s 读入不含空格的字符串。
    • 遍历字符:用 for 循环遍历字符串中的每个字符 s[i]
    • 判断并转换:若 s[i] >= 'a' && s[i] <= 'z',则执行 s[i] = s[i] - 'a' + 'A'
    • 输出结果:输出转换后的字符串。
  4. 时间/空间复杂度

    • 时间复杂度:\(O(n)\),其中 \(n\) 是字符串长度,只需一次遍历。
    • 空间复杂度:\(O(1)\),在原字符串上直接修改,无需额外空间。
  5. 字符串与 ASCII

    • ASCII 码规律:大写字母 'A''Z' 的 ASCII 码是连续的(65~90),小写字母 'a''z' 也是连续的(97~122),且同一字母的大小写之间相差 32(即 'a' - 'A' = 32)。因此,小写转大写可简化为 s[i] -= 32
    • 边界检查:如果字符串中包含非字母字符(如数字、标点),上述条件判断会跳过它们,保持原样。
    • 适用场景:这类字符串大小写转换问题非常基础,常用于练习字符串遍历和 ASCII 码操作。

【算法标签】

入门 #字符串入门

【代码详解】

#include <bits/stdc++.h>  // 包含标准库头文件(万能头文件)
using namespace std;      // 使用标准命名空间

int main()
{
    string s;            // 定义字符串变量:存储输入的字符串

    cin >> s;            // 输入字符串

    // 遍历字符串中的每个字符
    for (int i = 0; i < s.length(); i++)
    {
        // 判断当前字符是否为小写字母
        if (s[i] <= 'z' && s[i] >= 'a')
        {
            // 小写字母转大写字母:
            // 通过ASCII码计算,'a'-'A'是大小写字母的差值
            s[i] = s[i] - 'a' + 'A';
        }
    }

    cout << s;           // 输出转换后的字符串

    return 0;            // 程序正常结束
}

【运行结果】

Luogu4!
LUOGU4!
posted @ 2026-08-30 09:19  团爸讲算法  阅读(16)  评论(0)    收藏  举报