C++获取字符串最后一个单词长度的多种方法
问题描述给定一个由多个单词组成的句子每个单词由大小写字母混合构成单词间使用单个空格分隔。要求输出最后一个单词的长度。约束条件每个单词非空总字符长度不超过 103103单词间使用单个空格分隔示例1234输入HelloNowcoder输出13输入A B C D输出1解法一从后向前遍历法推荐123456789101112131415161718#include iostream#include stringusingnamespacestd;intmain() {string str;getline(cin, str);intlen 0;inti str.size() - 1;// 跳过末尾可能的空格虽然题目说没有但增加鲁棒性while(i 0 str[i] ) i--;// 计算最后一个单词的长度while(i 0 str[i] ! ) {len;i--;}cout len endl;return0;}算法分析时间复杂度O(n)最坏情况下需要遍历整个字符串空间复杂度O(1)只使用了常数个额外变量优点高效只需要一次遍历节省空间不需要额外存储鲁棒性好能处理末尾有空格的情况解法二使用rfind方法1234567891011121314151617#include iostream#include stringusingnamespacestd;intmain() {string str;getline(cin, str);// 从后向前查找最后一个空格的位置size_tpos str.rfind( );if(pos string::npos) {// 没有空格整个字符串就是一个单词cout str.size() endl;}else{// 计算最后一个单词的长度cout str.size() - pos - 1 endl;}return0;}关键点说明rfind( ): 从字符串末尾开始查找空格string::npos: 表示未找到值为-1但类型为size_t所以是最大无符号数注意处理只有一个单词的情况解法三使用stringstream分割12345678910111213141516#include iostream#include string#include sstreamusingnamespacestd;intmain() {string str;getline(cin, str);stringstream ss(str);string word, last_word;// 读取所有单词最后一个存储在last_word中while(ss word) {last_word word;}cout last_word.size() endl;return0;}算法特点优点代码简洁易读自动处理多余空格容易扩展如需要处理所有单词缺点需要额外的字符串拷贝使用stringstream有额外开销需要存储最后一个单词的完整副本解法四双指针法12345678910111213141516#include iostream#include stringusingnamespacestd;intmain() {string str;getline(cin, str);intright str.size() - 1;// 右指针跳过末尾空格while(right 0 str[right] ) right--;intleft right;// 左指针找到单词开头while(left 0 str[left] ! ) left--;// 计算长度cout right - left endl;return0;}算法性能对比方法时间复杂度空间复杂度优点缺点从后向前遍历O(n)O(1)效率高内存少需要手动处理边界rfind方法O(n)O(1)代码简洁需要处理nposstringstreamO(n)O(n)自动处理空格额外开销大双指针法O(n)O(1)思路清晰需要两个指针边界条件处理1. 空字符串12345// 在从后向前遍历法中if(str.empty()) {cout 0 endl;return0;}2. 全是空格12345// 在从后向前遍历法中第一个while循环后i可能为-1if(i 0) {cout 0 endl;return0;}3. 末尾有多个空格12// 所有方法都应该处理这种情况// 解法一和四已经通过while循环处理扩展问题1. 获取倒数第二个单词的长度1234567891011121314151617181920#include iostream#include stringusingnamespacestd;intmain() {string str;getline(cin, str);intcount 0;inti str.size() - 1;// 跳过末尾空格while(i 0 str[i] ) i--;// 找倒数第一个单词while(i 0 str[i] ! ) i--;// 跳过单词间的空格while(i 0 str[i] ) i--;// 找倒数第二个单词的末尾intend i;while(i 0 str[i] ! ) i--;cout end - i endl;return0;}2. 统计句子中单词的数量12345678910111213141516#include iostream#include string#include sstreamusingnamespacestd;intmain() {string str;getline(cin, str);stringstream ss(str);string word;intcount 0;while(ss word) {count;}cout count endl;return0;}3. 获取最长的单词12345678910111213141516171819#include iostream#include string#include sstreamusingnamespacestd;intmain() {string str;getline(cin, str);stringstream ss(str);string word, longest_word;intmax_len 0;while(ss word) {if(word.size() max_len) {max_len word.size();longest_word word;}}cout 最长单词: longest_word , 长度: max_len endl;return0;}实际应用场景1. 命令行工具12// 实现类似Linux的wc命令统计单词数// 可以扩展为获取最后一行或最后一个单词2. 文本编辑器12// 在代码编辑器中获取光标所在单词的长度// 用于自动补全或语法高亮3. 日志分析1// 分析日志文件的最后一个状态码或错误信息4. 自然语言处理12// 在NLP预处理中获取句子的最后一个词// 用于语言模型训练或情感分析测试用例1234567891011121314151617181920voidtest() {// 测试用例集合vectorpairstring,int test_cases {{HelloNowcoder, 13},{A B C D, 1},{Hello World, 5},{a, 1},{ , 0},// 全是空格{hello , 5},// 末尾有空格{ hello, 5},// 开头有空格{multiple spaces between, 7},// 多个空格{, 0},// 空字符串{12345 67890, 5},{The quick brown fox jumps over the lazy dog, 3}};for(auto test_case : test_cases) {// 测试各个算法cout 输入: \ test_case.first \, 期望: test_case.second endl;}}优化技巧1. 使用引用避免拷贝1234// 在处理大字符串时使用const引用voidprocessString(conststring str) {// 处理逻辑}2. 预分配内存12// 如果知道最大长度可以预分配str.reserve(1000);// 根据题目约束3. 使用C风格字符串1234567891011// 在性能关键场景可以使用C风格字符串intgetLastWordLength(constchar* str) {intlen 0;inti strlen(str) - 1;while(i 0 str[i] ) i--;while(i 0 str[i] ! ) {len;i--;}returnlen;}常见错误1. 忘记处理npos123// 错误示例size_tpos str.rfind( );intlength str.size() - pos - 1;// 当pos为npos时计算错误2. 未考虑末尾空格12345// 错误示例intpos str.rfind( );if(pos ! -1) {cout str.size() - pos - 1 endl;// 如果末尾有空格结果错误}3. 越界访问123// 错误示例inti str.size() - 1;while(str[i] ) i--;// 如果字符串为空i为-1访问越界总结获取字符串最后一个单词的长度是一个基础的字符串处理问题但它涉及了许多重要的编程概念字符串遍历技巧从后向前遍历是解决此类问题的关键边界条件处理空字符串、空格、单个单词等情况都需要考虑算法选择根据具体需求选择最合适的算法代码鲁棒性处理各种异常输入情况推荐方法从后向前遍历法效率高空间复杂度低代码清晰易于理解鲁棒性好能处理各种边界情况掌握这个问题的解法不仅能帮助解决类似问题还能提高字符串处理的基本功。在实际开发中根据具体场景选择最合适的方法才是最重要的。

相关新闻

DDS技术解析:从原理到实战,掌握现代信号源核心

DDS技术解析:从原理到实战,掌握现代信号源核心

1. 从模拟到数字:DDS技术为何成为现代信号源的核心如果你在射频、通信或者音频领域工作,那么“信号发生器”绝对是你工作台上的常客。从早期的模拟振荡器,到后来基于锁相环的频率合成器,再到如今几乎无处不在的直接数字频率合成技…

2026/10/25 2:55:40 阅读更多 →
“模板同质化”困局已破!用LLM+RAG重构AI模板知识库的5层架构设计(附GitHub开源代码库)

“模板同质化”困局已破!用LLM+RAG重构AI模板知识库的5层架构设计(附GitHub开源代码库)

更多请点击: https://codechina.net 第一章:AI做模板售卖 AI驱动的模板生成与售卖已成SaaS服务与开发者生态中的新兴商业模式。借助大语言模型(LLM)和多模态生成能力,开发者可快速将业务逻辑、UI结构、数据流等抽象为…

2026/10/24 16:31:12 阅读更多 →
基于AT89C52与Proteus的电子琴音乐盒仿真设计实战

基于AT89C52与Proteus的电子琴音乐盒仿真设计实战

这次我们来看一个基于 AT89C52 单片机的电子琴与音乐盒仿真设计项目。对于单片机初学者、电子爱好者或正在完成课程设计的学生来说,这是一个非常经典的实践案例。它不涉及复杂的 AI 模型或高额硬件成本,核心在于理解单片机如何通过编程控制外围设备&…

2026/10/25 11:23:50 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/25 11:19:54 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/24 17:47:00 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/24 18:34:36 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/25 10:02:42 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/25 3:12:30 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/24 21:09:59 阅读更多 →

日新闻

周新闻

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/25 10:02:43 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/25 13:21:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/25 7:47:32 阅读更多 →