题解:洛谷 P5015 标题统计
【题目来源】
洛谷:P5015 [NOIP 2018 普及组] 标题统计 - 洛谷
【题目描述】
凯凯刚写了一篇美妙的作文,请问这篇作文的标题中有多少个字符?注意:标题中可能包含大、小写英文字母、数字字符、空格和换行符。统计标题字符数时,空格和换行符不计算在内。
【输入】
输入文件只有一行,一个字符串 \(s\)。
【输出】
输出文件只有一行,包含一个整数,即作文标题的字符数(不含空格和换行符)。
【输入样例】
234
【输出样例】
3
【核心思想】
-
问题分析:给定一行可能包含空格和换行符的字符串(实际输入中换行符不会作为内容读入),要求统计其中非空格字符的数量,即字母、数字等可见字符的总数。本质是一个字符串遍历计数问题,只需排除空格即可。
-
算法选择:
- 整行读入 + 遍历计数:使用
getline(cin, s)读入包含空格的一整行。然后遍历字符串,统计非空格字符(或先统计总长度再减去空格数)。 - 注意:换行符不会出现在
getline读入的内容中,所以无需特殊处理。
- 整行读入 + 遍历计数:使用
-
关键步骤:
- 读入:用
getline(cin, s)读取整行(包括空格)。 - 统计:初始化
ans = 0,遍历s的每个字符,若s[i] != ' ',则ans++。 - 输出:输出
ans。
- 读入:用
-
时间/空间复杂度:
- 时间复杂度:\(O(n)\),\(n\) 是字符串长度。
- 空间复杂度:\(O(n)\),存储字符串。
-
字符串输入与计数:
getline的必要性:若使用cin >> s,则遇到空格会停止读入,无法处理包含空格的标题。getline可以读取整行直到换行符。- 统计方法:直接遍历计数非空格字符,或先取总长度再减去空格数,两种方法等效。
- 换行符:输入中的换行符作为行结束标志,不会被读入字符串,因此无需在计数中排除。
- 适用场景:这类“统计可见字符数”是字符串处理的基础题,常用于练习输入输出控制。
【算法标签】
入门 #字符串入门
【代码详解】
#include <bits/stdc++.h> // 包含标准库头文件(万能头文件)
using namespace std; // 使用标准命名空间
int main()
{
int ans = 0; // 定义变量:存储最终的非空格字符数
string s; // 定义字符串:存储输入的字符串
getline(cin, s); // 读取整行输入(包含空格)
ans = s.length(); // 初始化为字符串总长度
// 遍历字符串中的每个字符
for (int i = 0; i < s.length(); i++)
{
// 如果当前字符是空格,则减少计数
if (s[i] == ' ')
ans--;
}
cout << ans; // 输出非空格字符数
return 0; // 程序正常结束
}
【运行结果】
Ca 45
4
浙公网安备 33010602011771号