题解:洛谷 P5733 自动修正
【题目来源】
洛谷:P5733 【深基6.例1】自动修正 - 洛谷(luogu.com.cn)
【题目描述】
大家都知道一些办公软件有自动将字母转换为大写的功能。输入一个长度不超过 \(100\) 且不包括空格的字符串。要求将该字符串中的所有小写字母变成大写字母并输出。
【输入】
输入一行,一个字符串。
【输出】
输出一个字符串,即将原字符串中的所有小写字母转化为大写字母。
【输入样例】
Luogu4!
【输出样例】
LUOGU4!
【核心思想】
-
问题分析:给定一个长度不超过 100 且不包含空格的字符串,要求将其中所有小写字母转换为大写字母,并输出转换后的字符串。这是一个基础的字符串遍历与字符变换问题,核心是利用 ASCII 码的规律进行大小写转换。
-
算法选择:
- 遍历 + ASCII 转换:遍历字符串的每个字符,若字符是小写字母(ASCII 码在
'a'到'z'之间),则通过减去'a'再加上'A'将其转换为对应的大写字母。 - 内置函数(备选):C++ 标准库提供了
toupper()函数,可以直接将字符转换为大写。但本题旨在考察基础编程能力,使用 ASCII 计算更为常见。
- 遍历 + ASCII 转换:遍历字符串的每个字符,若字符是小写字母(ASCII 码在
-
关键步骤:
- 读入字符串:使用
cin >> s读入不含空格的字符串。 - 遍历字符:用
for循环遍历字符串中的每个字符s[i]。 - 判断并转换:若
s[i] >= 'a' && s[i] <= 'z',则执行s[i] = s[i] - 'a' + 'A'。 - 输出结果:输出转换后的字符串。
- 读入字符串:使用
-
时间/空间复杂度:
- 时间复杂度:\(O(n)\),其中 \(n\) 是字符串长度,只需一次遍历。
- 空间复杂度:\(O(1)\),在原字符串上直接修改,无需额外空间。
-
字符串与 ASCII:
- ASCII 码规律:大写字母
'A'到'Z'的 ASCII 码是连续的(65~90),小写字母'a'到'z'也是连续的(97~122),且同一字母的大小写之间相差 32(即'a' - 'A' = 32)。因此,小写转大写可简化为s[i] -= 32。 - 边界检查:如果字符串中包含非字母字符(如数字、标点),上述条件判断会跳过它们,保持原样。
- 适用场景:这类字符串大小写转换问题非常基础,常用于练习字符串遍历和 ASCII 码操作。
- 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!
浙公网安备 33010602011771号