【C++】PP5015 [NOIP2018 普及组] 标题统计

news2025/1/15 21:25:17

在这里插入图片描述

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳]
本文专栏: C++

文章目录

  • 💯前言
  • 💯题目背景
    • 题目描述
    • 输入格式
    • 输出格式
    • 样例 #1
      • 样例输入 #1
      • 样例输出 #1
    • 样例 #2
      • 样例输入 #2
      • 样例输出 #2
    • 提示
    • 数据规模与约定
  • 💯方法分析
    • 方法1:我的做法
      • 实现代码
      • 详细解析
      • 优点
      • 缺点
    • 方法2:老师的第一种做法
      • 实现代码
      • 详细解析
      • 优点
      • 缺点
    • 方法3:老师的第二种做法
      • 实现代码
      • 详细解析
      • 优点
      • 缺点
  • 💯方法对比与优化
    • 方法对比
    • 优化建议
  • 💯扩展与思考
    • 1. 字符串处理常用函数
    • 2. 输入方式的选择
    • 3. 实际应用场景
  • 💯小结


在这里插入图片描述


💯前言

  • 在学习C++编程的过程中,字符处理问题是一个重要的实践方向。本文将以NOIP2018普及组的一道题目"标题统计"为切入点,详细解析题目要求,并对三种实现方法进行对比和优化。文章还会结合题目扩展一些相关知识点,帮助读者深入理解字符串操作及其应用。
    C++ 参考手册
    在这里插入图片描述

💯题目背景

PP5015 [NOIP2018 普及组] 标题统计
在这里插入图片描述

这道题目源于NOIP2018普及组T1,目的是对作文标题中字符的数量进行统计。题目描述如下:

题目描述

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

输入格式

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

输出格式

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

样例 #1

样例输入 #1

234

样例输出 #1

3

样例 #2

样例输入 #2

Ca 45

样例输出 #2

4

提示

  • 样例 1 说明:标题中共有 3 个字符,这 3 个字符都是数字字符。
  • 样例 2 说明:标题中共有 4 个字符,包括 1 个大写字母,1 个小写字母和 2 个数字字符(忽略了空格)。

数据规模与约定

  • 对于 40% 的数据, 1 ≤ ∣ s ∣ ≤ 5 1 \leq |s| \leq 5 1s5,保证输入为数字字符及行末换行符。
  • 对于 100% 的数据, 1 ≤ ∣ s ∣ ≤ 5 1 \leq |s| \leq 5 1s5,输入可能包含大、小写英文字母、数字字符、空格和行末换行符。

💯方法分析

为了解决这道题目,我们探讨了三种主要的实现方式,并分析它们的优缺点。

方法1:我的做法

实现代码

#include <iostream>
#include <string>
using namespace std;

int main()
{
    int count = 0;
    string s;
    getline(cin, s); // 读取整行字符串

    for (int i = 0; i < s.size(); i++)
    {
        if (s[i] == ' ')
            continue; // 跳过空格
        count++;
    }

    cout << count << endl; // 输出统计结果
    return 0;
}

在这里插入图片描述

详细解析

  1. 输入方式:

    • 使用getline()读取整行输入,便于处理包含空格的内容。
  2. 统计逻辑:

    • 遍历字符串中的每个字符。
    • 通过判断字符是否为空格(s[i] == ' '),跳过统计。
    • 对于非空格字符,count累加。
  3. 输出结果:

    • 最终输出有效字符的数量。

优点

  • 逻辑简单,易于理解。
  • 手动实现字符过滤逻辑,适合初学者练习。

缺点

  • 没有考虑换行符和其他空白字符的处理。
  • 代码冗长,可以通过标准库函数简化。

方法2:老师的第一种做法

实现代码

#include <iostream>
#include <string>
#include <cctype>
using namespace std;

int main()
{
    string s;
    getline(cin, s); // 一次性读取整行输入

    int cnt = 0;
    for (auto e : s)
    {
        if (isspace(e)) // 判断是否为空白字符
            continue;
        else
            cnt++;
    }

    cout << cnt << endl; // 输出有效字符数
    return 0;
}

在这里插入图片描述

详细解析

  1. 输入方式:

    • 使用getline()读取整行输入,这种方式能读取包含空格的字符串。
    • 不会因为空格而分隔字符串,这是统计字符的基础。
  2. 统计逻辑:

    • 遍历字符串中的每个字符。
    • 使用isspace()判断字符是否为空白字符(包括空格、制表符和换行符)。
    • 如果是空白字符,则跳过;否则将计数器cnt加1。
  3. 输出结果:

    • 统计完成后,将有效字符的总数输出。

优点

  • 利用了C++标准库中的isspace()函数,过滤空白字符非常方便。
  • 更加通用,能处理所有空白字符而非仅空格。

缺点

  • 输入内容较大时,需一次性加载到内存,可能导致性能问题。

方法3:老师的第二种做法

实现代码

#include <iostream>
#include <string>
using namespace std;

int main()
{
    string s;
    int ans = 0;

    while (cin >> s) // 按单词读取
    {
        ans += s.size(); // 累计单词长度
    }

    cout << ans << endl; // 输出结果
    return 0;
}

在这里插入图片描述

详细解析

  1. 输入方式:

    • 使用cin >> s按单词读取输入,遇到空格或换行符自动分隔。
    • 每次只读取一个单词,避免一次性加载所有内容。
  2. 统计逻辑:

    • 对于每次读取的单词,直接调用s.size()获取其长度,并累计到ans中。
  3. 输出结果:

    • 所有单词处理完成后,输出有效字符总数。

优点

  • 更加节省内存,适合处理大输入数据。
  • 逻辑简洁,利用cin天然跳过空白字符的特性。

缺点

  • 按单词分隔输入,可能会在某些特殊场景下不够灵活(如连续空格的处理)。

💯方法对比与优化

方法对比

比较维度方法1:我的做法方法2:老师的第一种做法方法3:老师的第二种做法
内存使用较高,需要一次性加载整行内容较高,需要一次性加载整行内容较低,只处理一个单词
代码复杂度稍高,需要手动判断字符较低,使用标准库函数isspace()最低,直接利用cin分隔单词
适用场景输入内容较小或初学者练习输入内容较小且需要逐字符处理的场景输入内容较大或逐单词处理的场景

优化建议

  1. 统一有效字符的定义:

    • 如果题目要求更加严格,可以结合isalnum()函数,确保只统计字母和数字字符。
  2. 增强鲁棒性:

    • 在读取和统计时添加更多异常处理逻辑,如过滤特殊符号。
  3. 结合方法:

    • 将方法1和方法2结合,按实际需求选择读取方式,优化性能和灵活性。

💯扩展与思考

1. 字符串处理常用函数

  • isspace(char c):判断字符是否为空白字符。
  • isalnum(char c):判断字符是否为字母或数字。
  • tolower(char c) / toupper(char c):将字符转换为小写或大写。

2. 输入方式的选择

  • getline()
    • 适合处理整行输入,尤其是包含空格的内容。
  • cin >> s
    • 适合按单词分隔的场景,自带空白字符过滤。

3. 实际应用场景

  • 文本分析:如统计单词数、字符频率。
  • 数据过滤:如提取特定格式的内容。

💯小结

通过对NOIP2018普及组"标题统计"题目的深入分析,我们探讨了三种主要的实现方法,并对其优缺点和适用场景进行了详细对比。无论是整行读取还是按单词读取,都有各自的优势,可以根据具体需求灵活选择。在实际编程中,合理选择输入方式和统计逻辑,不仅能提高代码的效率,还能增强其鲁棒性。


在这里插入图片描述


在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2277185.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从玩具到工业控制--51单片机的跨界传奇【2】

咱们在上一篇博客里面讲解了什么是单片机《单片机入门》&#xff0c;让大家对单片机有了初步的了解。我们今天继续讲解一些有关单片机的知识&#xff0c;顺便也讲解一下我们单片机用到的C语言知识。如果你对C语言还不太了解的话&#xff0c;可以看看博主的C语言专栏哟&#xff…

线程池面试题目集合

最近面试中总是问到ThreadPoolExecutor类相关问题&#xff0c;在此集中整理下。 问题1.ThreadPoolExecutor的关键参数是哪些&#xff0c;任务添加过程中&#xff0c;内部线程是怎样构建的&#xff1f; a)任务到达时&#xff0c;线程池数目小于核心线程数corePoolSize&#xff0…

程序员独立开发竞品分析:确定网站使用什么建站系统

要确定一个网站使用的建站系统&#xff0c;可以通过以下几种方法尝试分析&#xff1a; 查看页面源代码&#xff1a; 打开网站&#xff0c;右键点击页面并选择“查看页面源代码”。在代码中查找一些常见的建站系统标志&#xff0c;例如&#xff1a; WordPress 的迹象&#xff1a…

基于Media+Unity的手部位姿三维位姿估计

使用mediapipe Unity 手部位姿三维位姿估计 参考文章 基于Mediapipe的姿势识别并同步到Unity人体模型中 MediapipeUnity3d实现虚拟手_unity mediapipe-CSDN博客 需求 我的需求就是快速、准确的跟踪手部位姿并实现一个三维显示。 主要思路 搭建mdeiapipe系统&#xff0c…

构建高性能网络服务:从 Socket 原理到 Netty 应用实践

1. 引言 在 Java 网络编程中&#xff0c;Socket 是实现网络通信的基础&#xff08;可以查看我的上一篇博客&#xff09;。它封装了 TCP/IP 协议栈&#xff0c;提供了底层通信的核心能力。而 Netty 是在 Socket 和 NIO 的基础上&#xff0c;进一步封装的高性能、异步事件驱动的…

Python入门10:高阶函数

一、什么是高阶函数 1.1、高阶函数的概念和作用&#xff1a; 高阶函数是指 接受函数作为参数 或者 返回函数 作为结果的函数。它在函数式编程中是一个重要概念&#xff08;函数式编程&#xff08;Functional Programming &#xff0c; FP &#xff09;是一 种编程范式&#xf…

python-leetcode-矩阵置零

73. 矩阵置零 - 力扣&#xff08;LeetCode&#xff09; class Solution:def setZeroes(self, matrix: List[List[int]]) -> None:"""Do not return anything, modify matrix in-place instead."""m, n len(matrix), len(matrix[0])row_zero …

MySQL数据库(SQL分类)

SQL分类 分类全称解释DDLData Definition Language数据定义语言&#xff0c;用来定义数据库对象&#xff08;数据库&#xff0c;表&#xff0c;字段&#xff09;DMLData Manipulation Language数据操作语言&#xff0c;用来对数据库表中的数据进行增删改DQLData Query Languag…

计算机网络 笔记 网络层1

网络层功能概述 主要的任务是把分组从源端传输到目的端&#xff0c;为分组交换网上的不同主句提供通信服务&#xff0c;网络层的传输单位是数据报。 主要的功能&#xff1b; 1&#xff0c;路由选择&#xff1a;路由选择指网络层根据特定算法&#xff0c;为数据包从源节点到目…

MyBatis-什么是MyBatis?以及MyBatis的快速入门。

简介 什么是 MyBatis&#xff1f; 什么是MyBatis? MyBatis是一款优秀的 持久层 框架&#xff0c;用于简化JDBC的开发。&#xff08;框架&#xff1a;是一个半成品软件&#xff0c;是一套可重用的、通用的、软件基础代码模型。在框架的基础上进行软件开发更加高效、规范、通用、…

Linux Kernel 之十 详解 PREEMPT_RT、Xenomai 的架构、源码、构建及使用

概述 现在的 RTOS 基本可以分为 Linux 阵营和非 Linux 阵营这两大阵营。非 Linux 阵营的各大 RTOS 都是独立发展,使用上也相对独立;而 Linux 阵营则有多种不同的实现方法来改造 Linux 以实现实时性要求。本文我们重点关注 Linux 阵营的实时内核实现方法! 本文我们重点关注 …

Swift 趣味开发:查找拼音首字母全部相同的 4 字成语(上)

概述 Swift 语言是一门现代化、安全、强大且还算性感的语言。在去年 WWDC 24 中苹果正式推出了秃头码农们期待许久的 Swift 6.0&#xff0c;它进一步完善了 Swift 语言的语法和语义&#xff0c;并再接再厉——强化了现代化并发模型的安全性和灵活性。 这里我们不妨用 Swift 来…

docker一张图理解

1、push 将本地的镜像上传到镜像仓库,要先登陆到镜像仓库。参数说明&#xff1a; –disable-content-trust : 忽略镜像的校验,默认开启 # 上传本地镜像myapache:v1到镜像仓库中。 docker push myapache:v1 1.2、search 从Docker Hub查找镜像。参数说明&#xff1a; –…

IoTDB 常见问题 QA 第三期

关于 IoTDB 的 Q & A IoTDB Q&A 第三期持续更新&#xff01;我们将定期汇总我们将定期汇总社区讨论频繁的问题&#xff0c;并展开进行详细回答&#xff0c;通过积累常见问题“小百科”&#xff0c;方便大家使用 IoTDB。 Q1&#xff1a;查询最新值 & null 数据相加方…

MyBatis实现数据库的CRUD

本文主要讲解使用MyBatis框架快速实现数据库中最常用的操作——CRUD。本文讲解的SQL语句都是MyBatis基于注解的方式定义的&#xff0c;相对简单。 Mybatis中#占位符和$拼接符的区别 “#”占位符 在使用MyBatis操作数据库的时候&#xff0c;可以直接使用如下SQL语句删除一条数…

Spring Boot 下的Swagger 3.0 与 Swagger 2.0 的详细对比

先说结论&#xff1a; Swgger 3.0 与Swagger 2.0 区别很大&#xff0c;Swagger3.0用了最新的注释实现更强大的功能&#xff0c;同时使得代码更优雅。 就个人而言&#xff0c;如果新项目推荐使用Swgger 3.0&#xff0c;对于工具而言新的一定比旧的好&#xff1b;对接于旧项目原…

关于2025年智能化招聘管理系统平台发展趋势

2025年&#xff0c;招聘管理领域正站在变革的十字路口&#xff0c;全新的技术浪潮与不断变化的职场生态相互碰撞&#xff0c;促使招聘管理系统成为重塑企业人才战略的关键力量。智能化招聘管理系统平台在这一背景下迅速崛起&#xff0c;其发展趋势不仅影响企业的招聘效率与质量…

go语言的sdk 适合用go原生还是gozero框架开发的判断与总结

在决定是否使用 Go 原生&#xff08;纯 Go&#xff09;开发&#xff0c;还是使用 GoZero 框架开发时&#xff0c;主要取决于项目的需求、规模和开发的复杂性。GoZero 框架提供了一些额外的功能&#xff0c;如微服务架构、RPC 支持、API 网关、任务调度等&#xff0c;这些是基于…

Elasticsearch 批量导入数据(_bluk方法)

官方API&#xff1a;https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html 建议先看API POST /<索引名>/_bulk 格式要求&#xff1a; POST _bulk { "index" : { "_index" : "test", "_id" : &q…

Mysql--重点篇--索引(索引分类,Hash和B-tree索引,聚簇和非聚簇索引,回表查询,覆盖索引,索引工作原理,索引失效,索引创建原则等)

索引是数据库中用于加速查询操作的重要机制。通过索引&#xff0c;MySQL可以快速定位到满足查询条件的数据行&#xff0c;而不需要扫描整个表。合理的索引设计可以显著提高查询性能&#xff0c;但不合理的索引可能会导致性能下降和磁盘空间浪费。因此&#xff0c;理解索引的工作…