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


在这里插入图片描述

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳]
本文专栏: 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;elsecnt++;}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.rhkb.cn/news/1725.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++第三方库】快速上手---轻量级数据库SQLite和单元测试工具Gtest

每日激励&#xff0c;“驾驭命运的舵是奋斗。不抱有幻想&#xff0c;不放弃一点机会&#xff0c;不停止一日努力。” 绪论​&#xff1a; 本篇文章将写道如何快速的上手Gtest和SQLite第三方库&#xff0c;这两个第三方库都是在项目编写过程中非常重要的。 —————— 话不多说…

《机器学习》——贝叶斯算法

贝叶斯简介 贝叶斯公式&#xff0c;又称贝叶斯定理、贝叶斯法则&#xff0c;最初是用来描述两个事件的条件概率间的关系的公式&#xff0c;后来被人们发现具有很深刻的实际意义和应用价值。该公式的实际内涵是&#xff0c;支持某项属性的事件发生得愈多&#xff0c;则该属性成…

优先级队列(算法十四)

简介 优先级队列其实就是堆 默认大根堆 小根堆&#xff1a;greater<T> std::priority_queue<int, std::vector<int>, std::greater<int>> pq; priority_queue 没有迭代器&#xff0c; 不能for&#xff08;auto e:pq); 不改变原来pq&#xff0c;查…

【day5】Redis持久化之AOF + Redis事务_锁机制

AOF是什么 以日志的形式来记录每个写操作(增量保存)&#xff0c;将 Redis 执行过的所有写指令记录下来(比 如 set/del 操作会记录, 读操作 get 不记录 只许追加文件但不可以改写文件 redis 启动之初会读取该文件重新构建数据 redis 重启的话就根据日志文件的内容将写指令从前到…

C#补充----反射,特性,迭代器,特殊语法,值类型运用类型。

1.反射。 《1》获取类的方式 《2》反射的应用 <1>获取类型的所有公共成员 <2>获取构造函数 <3>获取类型的 公共成员变量 <4>获取类型的 公共方法 <5>.获取类型的 属性 <6>.公共接口&#xff0c;公共枚举&#xff0c;公共事件

MyBatis——XML映射文件

在MyBatis中&#xff0c;既可以通过注解的方式配置SQL语句&#xff0c;也可以通过XML映射文件的方式配置SQL语句。对于简单的SQL语句建议直接通过注解的方式配置SQL语句&#xff1a; Delete("delete from user where id#{id}") Integer deleteById(Integer id);但是…

git使用-小白入门2

git使用-小白入门2 分支git branch——显示分支git checkout -b——创建&#xff0c;切换分支git merge——合并分支git log --graph——以图标形式查看分支 推送至远程仓库 分支 在进行多个并行作业时&#xff0c;我们会用到分支。在这类并行开发的过程中&#xff0c;往往同时…

OpenAI Whisper:语音识别技术的革新者—深入架构与参数

当下语音识别技术正以前所未有的速度发展&#xff0c;极大地推动了人机交互的便利性和效率。OpenAI的Whisper系统无疑是这一领域的佼佼者&#xff0c;它凭借其卓越的性能、广泛的适用性和创新的技术架构&#xff0c;正在重新定义语音转文本技术的规则。今天我们一起了解一下Whi…

TiDB常见操作指南:从入门到进阶

TiDB常见操作指南&#xff1a;从入门到进阶 TiDB作为一个分布式数据库&#xff0c;提供了丰富的操作接口和功能。无论是基本的数据库管理&#xff0c;还是更为复杂的分布式事务处理&#xff0c;TiDB都能灵活应对。在这篇文章中&#xff0c;我们将总结几种TiDB常见操作&#xf…

NVIDIA CUDA Linux 官方安装指南

本文翻译自&#xff1a;https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#post-installation-actions NVIDIA CUDALinux安装指南 CUDA工具包的Linux安装说明。 文章目录 1.导言1.1.系统要求1.2.操作系统支持政策1.3.主机编译器支持政策1.3.1.支持的C方言…

rtthread学习笔记系列(4/5/6/7/15/16)

文章目录 4. 杂项4.1 检查是否否是2的幂 5. 预编译命令void类型和rt_noreturn类型的区别 6.map文件分析7.汇编.s文件7.1 汇编指令7.1.1 BX7.1.2 LR链接寄存器7.1.4 []的作用7.1.4 简单的指令 7.2 MSR7.3 PRIMASK寄存器7.4.中断启用禁用7.3 HardFault_Handler 15 ARM指针寄存器1…

一个使用 Golang 编写的新一代网络爬虫框架,支持JS动态内容爬取

大家好&#xff0c;今天给大家分享一个由ProjectDiscovery组织开发的开源“下一代爬虫框架”Katana&#xff0c;旨在提供高效、灵活且功能丰富的网络爬取体验&#xff0c;适用于各种自动化管道和数据收集任务。 项目介绍 Katana 是 ProjectDiscovery 精心打造的命令行界面&…

【Redis】初识Redis

目录 Redis简介 Redis在内存中存储数据 Redis数据库中的应用 Redis缓存中的应用 Redis消息中间件 尾言 Redis简介 如下是Redis官网中&#xff0c;对Redis的一段描述 在这段描述中&#xff0c;我们提取如下关键要点&#xff1a; Redis主要用于在内存中存储数据Redis可…

IDEA的Git界面(ALT+9)log选项不显示问题小记

IDEA的Git界面ALT9 log选项不显示问题 当前问题idea中log界面什么都不显示其他选项界面正常通过命令查询git日志正常 预期效果解决办法1. 检查 IDEA 的 Git 设置2. 刷新 Git Log (什么都没有大概率是刷新不了)3. 检查分支和日志是否存在4. 清理 IDEA 缓存 (我用这个成功解决)✅…

赤店商城系统点餐小程序多门店分销APP共享股东h5源码saas账号独立版全插件全开源

代码介绍 后端编程语言采用&#xff1a;PHP yii2.0框架 前端代码采用&#xff1a;UNIAPP框架环境要求 推荐选择服务器配置&#xff1a;2核4G内存3M带宽 linux操作系统 控制面板&#xff1a;宝塔面板 运行环境&#xff1a;PHP7.2MYSQL5.7 赤店商城系统是一款集点餐小程序、多门…

穷举vs暴搜vs深搜vs回溯vs剪枝系列一>优美的排列

题目&#xff1a; 解析&#xff1a; 部分决策树&#xff1a; 代码设计&#xff1a; 代码&#xff1a; private int count;private boolean[] check;public int countArrangement(int n) {check new boolean[n1];dfs(n,1);return count;} private void dfs(int n, int pos){…

【C++图论 拓扑排序】2392. 给定条件下构造矩阵|1960

本文涉及知识点 C图论 拓扑排序 LeetCode2392. 给定条件下构造矩阵 给你一个 正 整数 k &#xff0c;同时给你&#xff1a; 一个大小为 n 的二维整数数组 rowConditions &#xff0c;其中 rowConditions[i] [abovei, belowi] 和 一个大小为 m 的二维整数数组 colConditions…

Anaconda安装(2024最新版)

安装新的anaconda需要卸载干净上一个版本的anaconda&#xff0c;不然可能会在新版本安装过程或者后续使用过程中出错&#xff0c;完全卸载干净anaconda的方法&#xff0c;可以参考我的博客&#xff01; 第一步&#xff1a;下载anaconda安装包 官网&#xff1a;Anaconda | The O…

SSE部署后无法连接问题解决

1. 问题现象 通过域名访问 https://api-uat.sfxs.com/sse/subscribe?tokenBearer%20eyJUxMiJ9.eyJhY2NvdW50IjoiYWRtaWZ0NvZGUiOiIwMDEiLCJyb2xidXNlcm5hbWUiOiLotoXnuqfnrqHnkIblkZgifQ.tlz9N61Y4 一直无法正常连接 2. 问题解决 nginx.conf进行配置 server {location /ss…

【优选算法篇】:分而治之--揭秘分治算法的魅力与实战应用

✨感谢您阅读本篇文章&#xff0c;文章内容是个人学习笔记的整理&#xff0c;如果哪里有误的话还请您指正噢✨ ✨ 个人主页&#xff1a;余辉zmh–CSDN博客 ✨ 文章所属专栏&#xff1a;优选算法篇–CSDN博客 文章目录 一.什么是分治算法1.分治算法的基本概念2.分治算法的三个步…