题解:洛谷 P5015 标题统计

【题目来源】

洛谷:P5015 [NOIP 2018 普及组] 标题统计 - 洛谷

【题目描述】

凯凯刚写了一篇美妙的作文,请问这篇作文的标题中有多少个字符?注意:标题中可能包含大、小写英文字母、数字字符、空格和换行符。统计标题字符数时,空格和换行符不计算在内。

【输入】

输入文件只有一行,一个字符串 \(s\)

【输出】

输出文件只有一行,包含一个整数,即作文标题的字符数(不含空格和换行符)。

【输入样例】

234

【输出样例】

3

【核心思想】

  1. 问题分析:给定一行可能包含空格和换行符的字符串(实际输入中换行符不会作为内容读入),要求统计其中非空格字符的数量,即字母、数字等可见字符的总数。本质是一个字符串遍历计数问题,只需排除空格即可。

  2. 算法选择

    • 整行读入 + 遍历计数:使用 getline(cin, s) 读入包含空格的一整行。然后遍历字符串,统计非空格字符(或先统计总长度再减去空格数)。
    • 注意:换行符不会出现在 getline 读入的内容中,所以无需特殊处理。
  3. 关键步骤

    • 读入:用 getline(cin, s) 读取整行(包括空格)。
    • 统计:初始化 ans = 0,遍历 s 的每个字符,若 s[i] != ' ',则 ans++
    • 输出:输出 ans
  4. 时间/空间复杂度

    • 时间复杂度:\(O(n)\)\(n\) 是字符串长度。
    • 空间复杂度:\(O(n)\),存储字符串。
  5. 字符串输入与计数

    • 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
posted @ 2026-08-31 09:26  团爸讲算法  阅读(17)  评论(0)    收藏  举报