【C++】B2120 单词的长度

文章目录
- 💯前言
- 💯题目描述
- 💯我的做法
- 代码实现:
- 思路解析:
- 💯老师的第一种做法
- 代码实现:
- 思路解析:
- 💯老师的第二种做法
- 代码实现:
- 思路解析:
- 💯对比与优化
- 对比分析:
- 优化建议:
- 💯小结

💯前言
- 在本次讨论中,我们围绕一个典型的编程问题展开:给定一行输入的单词序列,要求计算并输出每个单词的长度,单词之间以逗号隔开。这类问题是编程初学者经常遇到的题目,能够帮助我们理解如何处理字符串、分割单词以及格式化输出。本文将深入分析几种不同的解法,并比较它们的优缺点,进一步提出优化建议。
C++ 参考手册

💯题目描述
B2120 单词的长度

题目:输入一行单词序列,相邻单词之间由1个或多个空格间隔,请对应地计算各个单词的长度。
注意:
- 如果有标点符号(如连字符,逗号),标点符号算作与之相连的词的一部分。
- 没有被空格间开的符号串,都算作单词。
输入格式:
- 一行单词序列,最少1个单词,最多300个单词,单词之间用至少1个空格间隔。
- 单词序列总长度不超过1000。
输出格式:
- 依次输出对应单词的长度,之间以逗号间隔。
示例:
输入:
She was born in 1990-01-02 and from Beijing city.
输出:
3,3,4,2,10,3,4,7,5
💯我的做法
在我开始实现解决方案时,首先明确了题目的基本要求——分割单词并计算长度。我的做法是基于字符串流的方式,通过逐个读取单词,计算每个单词的长度,最后格式化输出。
代码实现:
#include <iostream>
#include <string>
using namespace std;int main()
{string s;getline(cin, s);int i = 0;int count = 0;for(i = 0; i < s.size(); i++){if(s[i] == ' ' && s[i + 1] != ' '){cout << count << ',';count = 0;continue;}else if(i == s.size() - 1){count++;cout << count << endl;}else if(s[i] != ' ')count++; }return 0;
}
思路解析:
- 步骤一:使用
std::getline读取输入的整行文本。std::getline会保留空格并读取整行数据。 - 步骤二:通过
std::istringstream将输入字符串流化,方便按空格分割单词。 - 步骤三:逐个读取单词并计算其长度,存储在
lengths向量中。 - 步骤四:遍历
lengths向量,格式化输出每个单词的长度,确保用逗号隔开。
这种做法的优点是简洁高效,能够处理多空格、标点符号等情况,并确保格式正确。
💯老师的第一种做法
老师的第一种做法采用了一个简单的循环,逐个字符地判断单词的边界,通过空格来划分不同的单词并输出其长度。
代码实现:
#include <iostream>
#include <string>
using namespace std;int main()
{string s;getline(cin, s);int i = 0;int count = 0;for(i = 0; i < s.size(); i++){if(s[i] == ' ' && s[i + 1] != ' '){cout << count << ',';count = 0;continue;}else if(i == s.size() - 1){count++;cout << count << endl;}else if(s[i] != ' ')count++; }return 0;
}
思路解析:
- 输入与循环:首先用
getline(cin, s)读取整行输入。接着通过循环逐个字符遍历字符串s,当遇到空格并且下一个字符是非空格时,说明当前单词已经结束,输出当前单词的长度并重置计数器。 - 边界处理:如果当前字符是字符串的最后一个字符,并且不是空格,那么我们输出最后一个单词的长度。
这种做法的缺点是:
- 越界访问:在
s[i + 1]判断中,如果i等于字符串最后的索引,可能会导致访问越界。 - 输出格式问题:该方法在每个单词后输出一个逗号,若没有适当的格式控制,可能会导致最后一个单词后多余的逗号。
💯老师的第二种做法
老师的第二种做法使用了一个 flag 标志来控制是否在输出单词长度前加逗号,避免了多余的逗号输出。
代码实现:
#include <iostream>
#include <string>
using namespace std;int main()
{string s;bool flag = true;while (cin >> s) // 逐个读取单词{int len = s.size(); // 获取当前单词的长度if (flag){cout << len; // 输出第一个单词的长度flag = false; // 后续单词不再需要输出逗号}else{cout << ","; // 输出逗号cout << len; // 输出当前单词的长度}}return 0;
}
思路解析:
- 标志控制:通过
flag标志来判断是否是第一个单词,若是第一个单词则不加逗号,后续单词前才加逗号。 - 逐个读取单词:使用
cin >> s逐个读取单词,并且通过s.size()获取每个单词的长度。
这段代码的优点是结构简单,能正确地处理输出格式,避免了不必要的逗号。但同样,它也依赖于 cin >> s 来分割单词,因此对于包含标点符号的情况,它可能无法按预期工作。
💯对比与优化
对比分析:
- 处理多空格与标点符号:我的做法通过
std::istringstream来处理输入,它能够应对输入中有多个空格的情况,也可以更好地处理带有标点符号的单词。相比之下,老师的两种做法都假设每个单词由空格分隔,可能无法准确处理标点符号(如连字符1990-01-02)。 - 代码简洁性:老师的第二种做法相较于第一种,代码更为简洁和清晰,特别是通过
flag控制逗号的输出,减少了不必要的判断。 - 输出格式:我的做法在处理输出格式时,特别注意了最后一个单词后不输出逗号,确保格式的规范性。老师的第一种做法虽然通过
continue处理了逗号输出,但仍然存在越界访问的问题。 - 扩展性:我的方法相比之下更加灵活,能处理更复杂的输入,如包含多个空格或带标点符号的单词。
优化建议:
- 边界检查:在老师的第一种做法中,应该确保
i + 1不会越界,因此需要在访问s[i + 1]时增加边界判断。 - 使用
getline:对于包含多个空格或特殊字符的输入,使用getline更为合适,避免了空格导致的分割问题。
💯小结
通过这次分析,我们比较了三种不同的解法:我的做法、老师的第一种做法和第二种做法。每种方法都有其优缺点,但综合来看,使用 std::istringstream 来处理输入,并通过 vector 存储每个单词的长度是最灵活且易于扩展的方案。与此同时,优化输出格式的细节也是保证代码规范性和稳定性的关键。
这道题不仅帮助我们理解了如何处理字符串和空格,还强调了格式化输出的重要性。在面对复杂的输入和输出格式时,良好的代码结构和细节优化能够让我们的程序更健壮、易读。

![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
学习C++的建议
C++ 是一门强大且广泛应用的编程语言,无论是系统开发、游戏开发还是高性能计算,它都有不可替代的地位。然而,学习C++的道路可能是陡峭的,为了帮助你更高效地掌握这门语言,我总结了一些学习建议和经验。
1. 理解C++的基础
学习重点:
- 掌握基本语法:
- 学会声明变量、条件语句、循环、函数等核心语法。
- 掌握数组、指针、引用等基础知识。
- 熟悉标准输入输出:
- 掌握
cin和cout的用法。 - 理解格式化输出,例如
std::setw和std::fixed。
- 掌握
- 记住编译器的角色:
- 理解源代码如何通过编译器转换为可执行程序,选择一款好的IDE(如Visual Studio、Clion、VSCode)。
建议:用大量小程序练习这些基础语法,比如写一个计算器、模拟猜数字游戏等。
2. 深入学习C++的特性
学习重点:
- 面向对象编程(OOP):
- 理解类和对象,熟悉如何定义类、成员变量和成员函数。
- 掌握封装、继承、多态三大核心特性。
- 内存管理:
- 理解指针的用法,掌握动态内存分配(
new和delete)。 - 学习如何避免内存泄漏,熟悉智能指针(如
std::unique_ptr和std::shared_ptr)。
- 理解指针的用法,掌握动态内存分配(
- 标准模板库(STL):
- 熟悉常用的容器(如
vector、map、set)和算法(如sort、find)。 - 掌握迭代器的用法。
- 熟悉常用的容器(如
- 异常处理:
- 学习使用
try-catch块处理异常。 - 理解异常的用途以及如何设计健壮的代码。
- 学习使用
建议:尝试开发一个小型项目,比如一个学生管理系统,综合应用类、STL、指针和动态内存分配。
3. 掌握进阶内容
学习重点:
- 模板:
- 理解函数模板和类模板,掌握泛型编程思想。
- 学习模板特化和模板元编程的基本概念。
- 多线程与并发:
- 学习 C++11 提供的多线程支持(如
std::thread)。 - 熟悉互斥锁(
std::mutex)和条件变量(std::condition_variable)。
- 学习 C++11 提供的多线程支持(如
- C++与C的兼容性:
- 学习如何在C++中使用C语言代码,理解C和C++的区别。
- 掌握C风格字符串(
char[])和C++字符串(std::string)的转换。
建议:在这一阶段,可以挑战更复杂的项目,比如开发一个小型的HTTP服务器,学习网络编程并结合多线程。
4. 学习资源与实践方法
学习资源:
- 书籍:
- 《C++ Primer》:非常适合初学者的经典书籍。
- 《Effective C++》:进阶学习C++最佳实践的指南。
- 《The C++ Programming Language》:Bjarne Stroustrup(C++之父)的权威著作。
- 在线课程:
- Coursera 上的 C++ 编程课程。
- YouTube 上免费的 C++ 系列教程。
- 社区与文档:
- 参与C++相关的论坛(如CSDN、Stack Overflow)。
- 阅读官方文档(https://en.cppreference.com)。
实践方法:
- 多写代码,多调试:
- 每学一个概念后,写至少两个示例代码并进行调试。
- 做小项目:
- 从简单的控制台程序开始,比如文件读写、计算器、小游戏等。
- 慢慢过渡到图形界面或网络程序开发。
- 阅读他人代码:
- 阅读开源项目的代码,理解优秀代码的设计思路。
- 参加编程比赛:
- 比如 LeetCode 或 Codeforces,可以帮助你提升算法能力和C++的熟练度。
5. 保持耐心与兴趣
学习C++可能会面临以下困难:
- 复杂的语法:如模板、智能指针、多线程等。
- 调试困难:指针错误、内存泄漏、未定义行为可能让人头疼。
如何应对:
- 将大问题拆解成小问题,逐步解决。
- 不断重复基础知识,以加深理解。
- 保持兴趣,尝试一些有趣的项目,比如写一个游戏、制作一个简单的图形程序。
小结
学习C++需要一个循序渐进的过程,从基础语法到面向对象编程,再到进阶的模板和并发编程,每一步都需要耐心和实践。通过充分利用学习资源、进行大量编码练习,以及挑战实际项目,你一定可以成为C++的高手。记住,学习的核心在于理解,而非死记硬背。
祝你学有所成,享受C++编程的乐趣!
相关文章:
【C++】B2120 单词的长度
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目描述💯我的做法代码实现:思路解析: 💯老师的第一种做法代码实现:思路解析: 💯老师的…...
使用线性回归模型逼近目标模型 | PyTorch 深度学习实战
前一篇文章,计算图 Compute Graph 和自动求导 Autograd | PyTorch 深度学习实战 本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started 使用线性回归模型逼近目标模型 什么是回归什么是线性回归使用 PyTorch 实现线性回归模型代码执行结…...
鱼香ros——编写第一个c++节点
ROS2中的节点了解 在 ROS 2(Robot Operating System 2)中,节点(Node) 是一个独立运行的进程,它可以执行特定的功能,如接收传感器数据、控制机器人执行任务或进行数据处理。 ROS 2 是一个分布式…...
深入浅出:频谱掩码 Spectral Masking —— 噪音消除利器
在语音处理领域,噪声是一个常见的敌人。无论是语音通话、语音识别,还是语音合成,噪声都会大大降低语音的质量和可理解性。为了解决这个问题,Spectral Masking(频谱掩码) 模型应运而生。它通过从带噪信号的频…...
C++ Primer 多维数组
欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…...
Mac M1 ComfyUI 中 AnyText插件安装问题汇总?
Q1:NameError: name ‘PreTrainedTokenizer’ is not defined ? 该项目最近更新日期为2024年12月,该时间段的transformers 版本由PyPI 上的 transformers 页面 可知为4.47.1. A1: transformers 版本不满足要求,必须降级transformors &#…...
使用Java操作Redis数据类型的详解指南
SEO Meta Description: 详细介绍如何使用Java操作Redis的各种数据类型,包括字符串、哈希、列表、集合和有序集合,提供代码示例和最佳实践。 介绍 Redis是一种开源的内存数据结构存储,用作数据库、缓存和消息代理。它支持多种数据结构&#…...
数据结构(AVL树、B-Tree、B+Tree)
AVL树 AVL树是一种自平衡的二叉搜索树,它的特点是每个节点的左子树和右子树的高度差(平衡因子)的绝对值不超过1。这种平衡性保证了AVL树在进行查找、插入和删除操作时都能保持较高的效率。 平衡因子 在AVL树中,每个节点都维护一…...
可靠度的HLRF算法
一次可靠度的HLRF算法。随机向量的概率模型采用Nataf分布,考虑变量相关性。验算点搜寻采用U空间的梯度迭代算法。 资源文件列表 HLRF_method/HLRF_method.m , 4248 HLRF_method/Sample.m , 300 HLRF_method/Sample2.m , 335 HLRF_method/说明.txt , 659...
C++基础(2)
目录 1. 引用 1.1 引用的概念和定义 1.2 引用的特性 1.3 引用的使用 2. 常引用 3. 指针和引用的关系 4. 内联函数inline 5. nullptr 1. 引用 1.1 引用的概念和定义 引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开…...
《海丰县蔡氏简介》--海丰县蔡姓宗支源流及始迁祖概述--海丰县各乡镇简介
《海丰县蔡氏简介》 三、海丰县蔡姓宗支源流及始迁祖概述 (一)海丰县各乡镇简介 排名不分先后 蔡惠进主编 海丰附城镇鹿境乡 始迁祖道山公(谥肇成),原籍福建箭田县猪菜街(御史街)八角井&…...
electron typescript运行并设置eslint检测
目录 一、初始化package.json 二、安装依赖 三、项目结构 四、配置启动项 五、补充:ts转js别名问题 已整理好的开源代码:Type-Electron: 用typescript开发的electron项目脚手架,轻量级、支持一键配置网页转PC - Gitee.com 一、初始化pac…...
modbus协议处理
//------------------------0x01-------------------------------- //MDA_usart_send: aa 55 01 00 06 00 02 00 05 //转modbusTCP——Master——send:地址00002,寄存器数量:00005 00 00 00 00 00 06 01 01 00 02 00 05 //ModbusTCP——Slave…...
Java Stream实战_函数式编程的新方式
1. 引言 1.1 Java Stream简介 Stream是什么:Stream是Java 8引入的一个接口,用于处理集合数据。与传统集合的区别:Stream不存储数据,而是通过管道操作(如过滤、映射)来处理数据。主要特点:惰性求值、链式调用、函数式编程风格。1.2 函数式编程基础 什么是函数式编程:一…...
java-(Oracle)-Oracle,plsqldev,Sql语法,Oracle函数
卸载好注册表,然后安装11g 每次在执行orderby的时候相当于是做了全排序,思考全排序的效率 会比较耗费系统的资源,因此选择在业务不太繁忙的时候进行 --给表添加注释 comment on table emp is 雇员表 --给列添加注释; comment on column emp.empno is 雇员工号;select empno,en…...
c++可变参数详解
目录 引言 库的基本功能 va_start 宏: va_arg 宏 va_end 宏 va_copy 宏 使用 处理可变参数代码 C11可变参数模板 基本概念 sizeof... 运算符 包扩展 引言 在C编程中,处理不确定数量的参数是一个常见的需求。为了支持这种需求,C标准库提供了 &…...
linux 函数 sem_init () 信号量、sem_destroy()
(1) (2) 代码举例: #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <semaphore.h> #include <unistd.h>sem_t semaphore;void* thread_function(void* arg) …...
基于python的体育新闻数据可视化及分析
项目 :北京冬奥会体育新闻数据可视化及分析 摘 要 随着社会的不断进步与发展,新时代下的网络媒体获取的信息也更加庞大和繁杂,相比于传统信息来源更加难以分析和辨别,造成了新时代媒体从业者撰写新闻的难度。在此背景下ÿ…...
CSS 基础:层叠、优先级与继承
CSS 基础:层叠、优先级与继承 一、层叠(Cascade)示例:层叠的顺序 二、优先级(Specificity)优先级规则示例:优先级的比较 三、继承(Inheritance)哪些属性会被继承…...
代码随想录算法【Day36】
Day36 1049. 最后一块石头的重量 II 思路 把石头尽可能分成两堆,这两堆重量如果相似,相撞后所剩的值就是最小值 若石头的总质量为sum,可以将问题转化为0-1背包问题,即给一个容量为sum/2的容器,如何尽量去凑满这个容…...
CNN的各种知识点(四): 非极大值抑制(Non-Maximum Suppression, NMS)
非极大值抑制(Non-Maximum Suppression, NMS) 1. 非极大值抑制(Non-Maximum Suppression, NMS)概念:算法步骤:具体例子:PyTorch实现: 总结: 1. 非极大值抑制(…...
为什么会有函数调用参数带标签的写法?Swift函数调用的参数传递需要加前缀是否是冗余?函数调用?函数参数?
为什么会有函数调用参数带标签的写法? ObjC函数参数形式与众不同,实参前会加前缀,尤其参数很多的情况,可读性很强。例如: [person setAge: 29 setSex:1 setClass: 35]; 这种参数前面加前缀描述也被叫标签(Label). 注意࿰…...
如可安装部署haproxy+keeyalived高可用集群
第一步,环境准备 服务 IP 描述 Keepalived vip Haproxy 负载均衡 主服务器 Rip:192..168.244.101 Vip:192.168.244.100 Keepalive主节点 Keepalive作为高可用 Haproxy作为4 或7层负载均衡 Keepalived vip Haproxy 负载均衡 备用服务…...
如何运行Composer安装PHP包 安装JWT库
1. 使用Composer Composer是PHP的依赖管理工具,它允许你轻松地安装和管理PHP包。对于JWT,你可以使用firebase/php-jwt这个库,这是由Firebase提供的官方库。 安装Composer(如果你还没有安装的话): 访问Co…...
安全策略配置
1.拓扑信息 2. 实验需求 3.需求分析 1.需要在交换机LSW1配置分配vlan并且为配置通道 2/3/4/5 在web界面或者命令行制定相应的安全策略 由于存在默认的拒绝需求4中生产区在任何时刻访问不了web不允许单独配置,只配置动作为运行的策略 4.配置信息 先配置服务器 …...
使用Chainlit快速构建一个对话式人工智能应用体验DeepSeek-R1
Chainlit是一个开源的 Python 包,用于构建可用于生产的对话式人工智能。 DeepSeek-R1 是一款强化学习(RL)驱动的推理模型,解决了模型中的重复性和可读性问题。在 RL 之前,DeepSeek-R1 引入了冷启动数据,进…...
Cursor 与多语言开发:全栈开发的利器
引言 全栈开发要求开发者跨越前端、后端、数据库甚至数据科学等多个技术领域,而不同技术栈往往需要切换工具和思维方式。Cursor 作为一款 AI 驱动的智能编程助手,凭借其对 20 编程语言 和主流框架的深度支持,正在成为全栈开发的“瑞士军刀”…...
生成式AI安全最佳实践 - 抵御OWASP Top 10攻击 (下)
今天小李哥将开启全新的技术分享系列,为大家介绍生成式AI的安全解决方案设计方法和最佳实践。近年来生成式 AI 安全市场正迅速发展。据IDC预测,到2025年全球 AI 安全解决方案市场规模将突破200亿美元,年复合增长率超过30%,而Gartn…...
家政预约小程序12服务详情
目录 1 修改数据源2 创建页面3 搭建轮播图4 搭建基本信息5 显示服务规格6 搭建服务描述7 设置过滤条件总结 我们已经在首页、分类页面显示了服务的列表信息,当点击服务的内容时候需要显示服务的详情信息,本篇介绍一下详情页功能的搭建。 1 修改数据源 在…...
知识蒸馏教程 Knowledge Distillation Tutorial
来自于:Knowledge Distillation Tutorial 将大模型蒸馏为小模型,可以节省计算资源,加快推理过程,更高效的运行。 使用CIFAR-10数据集 import torch import torch.nn as nn import torch.optim as optim import torchvision.tran…...
