【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 文章目录 💯前言💯题目描述💯我的做法代码实现:思路解析: 💯老师的第一种做法代码实现:思路解析: 💯老师的…...
2501,编写dll
DLL的优点 简单的说,dll有以下几个优点: 1)节省内存.同一个软件模块,若是源码重用,则会在不同可执行程序中编译,同时运行这些exe时,会在内存中重复加载这些模块的二进制码. 如果使用dll,则只在内存中加载一次,所有使用该dll的进程会共享此块内存(当然,每个进程会复制一份的d…...
【router路由的配置】
router路由的配置 App.vuerouter在main.ts引入插件 App.vue <template><RouterView /> </template><script setup lang"ts"></script><style scoped lang"scss"></style>router import { createRouter, creat…...
算法基础——一致性
引入 最早研究一致性的场景既不是大数据领域,也不是分布式系统,而是多路处理器。 可以将多路处理器理解为单机计算机系统内部的分布式场景,它有多个执行单元,每一个执行单元都有自己的存储(缓存),一个执行单元修改了…...
刷题记录 动态规划-6: 62. 不同路径
题目:62. 不同路径 难度:中等 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” &#x…...
docker直接运行arm下的docker
运行环境是树莓派A 处理器是 arm32v6 安装了docker,运行lamp 编译安装php的时候发现要按天来算,于是用电脑vm下的Ubuntu系统运行arm的docker 然后打包到a直接导入运行就可以了 第一种方法 sudo apt install qemu-user-static 导入直接运行就可以了…...
014-STM32单片机实现矩阵薄膜键盘设计
1.功能说明 本设计主要是利用STM32驱动矩阵薄膜键盘,当按下按键后OLED显示屏上会对应显示当前的按键键值,可以将此设计扩展做成电子秤、超市收银机、计算器等需要多个按键操作的单片机应用。 2.硬件接线 模块管脚STM32单片机管脚矩阵键盘行1PA0矩阵键盘…...
Sentinel 断路器在Spring Cloud使用
文章目录 Sentinel 介绍同类对比微服务雪崩问题问题原因问题解决方案请求限流线程隔离失败处理服务熔断解决雪崩问题的常见方案有哪些? Sentineldocker 安装账号/ 密码项目导入簇点链路请求限流线程隔离Fallback服务掉线时的处理流程 服务熔断 Sentinel 介绍 随着微…...
[内网安全] 内网渗透 - 学习手册
这是一篇专栏的目录文档,方便读者系统性的学习,笔者后续会持续更新文档内容。 如果没有特殊情况的话,大概是一天两篇的速度。(实验多或者节假日,可能会放缓) 笔者也是一边学习一边记录笔记,如果…...
算法总结-二分查找
文章目录 1.搜索插入位置1.答案2.思路 2.搜索二维矩阵1.答案2.思路 3.寻找峰值1.答案2.思路 4.搜索旋转排序数组1.答案2.思路 5.在排序数组中查找元素的第一个和最后一个位置1.答案2.思路 6.寻找旋转排序数组中的最小值1.答案2.思路 1.搜索插入位置 1.答案 package com.sunxi…...
基于python的Kimi AI 聊天应用
因为这几天deepseek有点状况,导致apikey一直生成不了,用kimi练练手。这是一个基于 Moonshot AI 的 Kimi 接口开发的聊天应用程序,使用 Python Tkinter 构建图形界面。 项目结构 项目由三个主要Python文件组成: 1. main_kimi.py…...
动手学深度学习-3.2 线性回归的从0开始
以下是代码的逐段解析及其实际作用: 1. 环境设置与库导入 %matplotlib inline import random import torch from d2l import torch as d2l作用: %matplotlib inline:在 Jupyter Notebook 中内嵌显示 matplotlib 图形。random:生成…...
Spring 面试题【每日20道】【其二】
1、Spring MVC 具体的工作原理? 中等 Spring MVC 是 Spring 框架的一部分,专门用于构建基于Java的Web应用程序。它采用模型-视图-控制器(MVC)架构模式,有助于分离应用程序的不同方面,如输入逻辑、业务逻辑…...
嵌入式八股文面试题(一)C语言部分
1. 变量/函数的声明和定义的区别? (1)变量 定义不仅告知编译器变量的类型和名字,还会分配内存空间。 int x 10; // 定义并初始化x int x; //同样是定义 声明只是告诉编译器变量的名字和类型,但并不为它分配内存空间…...
Vue06
目录 一、声明式导航-导航链接 1.需求 2.解决方案 3.通过router-link自带的两个样式进行高亮 二、声明式导航的两个类名 1.router-link-active 2.router-link-exact-active 三、声明式导航-自定义类名(了解) 1.问题 2.解决方案 3.代码演示 四…...
deepseek-r1模型本地win10部署
转载自大佬:高效快速教你deepseek如何进行本地部署并且可视化对话 deepseek 如果安装遇到这个问题 Error: Post “http://127.0.0.1:11434/api/show”: read tcp 127. 用管理员cmd打开 接着再去切换盘符d: cd 文件夹 重新下载模型:ollama run deepseek…...
自定义数据集 使用scikit-learn中SVM的包实现SVM分类
生成自定义数据集 生成一个简单的二维数据集,包含两类数据点,分别用不同的标签表示。 import numpy as np import matplotlib.pyplot as plt# 生成数据 np.random.seed(42) X np.r_[np.random.randn(100, 2) - [2, 2], np.random.randn(100, 2) [2, …...
pandas的melt方法使用
Pandas 的 melt 方法用于将宽格式(wide format)的 DataFrame 转换为长格式(long format)的 DataFrame。这种转换在数据处理和可视化中非常有用,尤其是在处理多列数据时。 宽格式 vs 长格式 宽格式(Wide F…...
一文讲解Spring中应用的设计模式
我们都知道Spring 框架中用了蛮多设计模式的: 工厂模式呢,就是用来创建对象的,把对象的创建和使用分开,这样代码更灵活。代理模式呢,是用一个代理对象来控制对真实对象的访问,可以在访问前后做一些处理。单…...
Linux的基本指令(下)
1.find指令 Linux下find命令在⽬录结构中搜索⽂件,并执⾏指定的操作。 Linux下find命令提供了相当多的查找条件,功能很强⼤。由于find具有强⼤的功能,所以它的选项也很多,其中⼤部分选项都值得我们花时间来了解⼀下。 即使系统中含…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...
【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG
TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码:HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…...
Ubuntu系统多网卡多相机IP设置方法
目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机,交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息,系统版本:Ubuntu22.04.5 LTS;内核版本…...
java高级——高阶函数、如何定义一个函数式接口类似stream流的filter
java高级——高阶函数、stream流 前情提要文章介绍一、函数伊始1.1 合格的函数1.2 有形的函数2. 函数对象2.1 函数对象——行为参数化2.2 函数对象——延迟执行 二、 函数编程语法1. 函数对象表现形式1.1 Lambda表达式1.2 方法引用(Math::max) 2 函数接口…...
