题目部分:
解题思路:
方案一:
对于本题,看似简单,其实有坑。
就是在获取单词这块,不能直接用cin这样子操作,否则不能获取到完整的单词,因为cin这样的读到空格就不会往后续读了,很明显若存在多个单词的话就不行了。
但是你可以借助cin.get()类似这样方式的获取。然而还有一个更加简单的方法就是使用string类中提供的方法getline接口获取完整的单词。
解决了获取完整单词这个麻烦剩下的问题就不是事,简单至极。
题目要求是获取字符串最后一个单词的长度,很明显这题如同我前面所说那般会分为两种情况讨论,分别是多个单词和单个单词的情况。根据题目的分析,两者之间最显著的区别就是中间是否会存在空格间隔。把握住这个关键点我们就可以大做文章了。
具体而言就是先简单判断是否是单个单词的情况,因为相对于多个单词的情况,单个单词求长度会非常简单,直接调用string中的size/length方法就可以直接计算出长度进行输出了。
当排除是单个单词的情况时,剩下就只能是多个单词的情况了,对于多个单词,我们可以通过string类中提供的接口方法rfind,反方向寻找出空格,那么就可以确定最后一个单词的具体所在位置,就可以计算出及其长度了。
接下来以示例1为例进行演示讲解:
附:示例1计算最后一个单词长度的图解:
这张图通过示例1来将其分析,示例1的字符串总长度一眼就能看出来是14,hello(5个字母)+ 空格(1个空格隔开) + newcoder(8个字符)组合的字符串,我们通过string类中的rfind方法找到最后一个单词前的空格位置,确定了最后一个单词的位置。那么接下来计算出最后一个单词的长度就是轻轻松松的事情。但是这里有个坑,就是数组的下标是从0开始的,所以rfind找到空格对应位置的数组下标是5而不是6,所以计算长度时要额外减去1,这个千万不要忘记了,否则就掉坑了。
我觉得通过上面我详细地阐述讲解已经能很明显陈述了我对于单个单词和多个单词两种情况下具体代码实现逻辑了,要是还有xd不能理解的话,那么为师真的已经尽力了。
方案一演示代码讲解如下:
附:方案一源码提取:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s; // 定义字符串
getline(cin, s); // 获取字符串
// 一般情况下,当不是只有单个单词时,存在多个单词时
// 我们逆方向找,遇到空格代表这就是最后一个单词
size_t pos = s.rfind(' ');
// 判断是否存在空格情况,若没有说明只有一个单词
if (pos == string::npos)
{
// 只有一个单词时直接返回单词长度即可
cout << s.size() << endl;
}
else
{
// 若是存在多个单词时
// 要切记我们拿到的是最后一个单词前空格的前一个位置
cout << s.size() - pos - 1 << endl;
}
return 0;
}
测试结果:
方案一:
不出意外的话家人们肯定是狠狠拿下!
备注:
楼主不才,不喜勿喷,若有错误或需要改进的地方,非常感谢你的指出,我会积极学习采纳。谢谢家人们一直以来的支持和鼓励,我会继续努力再接再励创作出更多优质的文章来回报家人们的。编程爱好的xdm,若有编程学习方面的问题可以私信我一同探讨(我尽力帮),毕竟“众人拾柴火焰高”,大家一起交流学习,共同进步!
2023年4月11日