ARTICLE DETAIL

资讯详情

深耕网站SEO优化与搜索引擎排名提升的一线实战洞察。

C++获取字符串最后一个单词长度的多种方法

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访问越界总结获取字符串最后一个单词的长度是一个基础的字符串处理问题但它涉及了许多重要的编程概念字符串遍历技巧从后向前遍历是解决此类问题的关键边界条件处理空字符串、空格、单个单词等情况都需要考虑算法选择根据具体需求选择最合适的算法代码鲁棒性处理各种异常输入情况推荐方法从后向前遍历法效率高空间复杂度低代码清晰易于理解鲁棒性好能处理各种边界情况掌握这个问题的解法不仅能帮助解决类似问题还能提高字符串处理的基本功。在实际开发中根据具体场景选择最合适的方法才是最重要的。
返回列表