Day01 2023/01/08
字符串最后一个单词的长度_牛客题霸_牛客网 (nowcoder.com)
题目
计算字符串最后一个单词的长度,单词以空格隔开,字符串长度小于5000(注:字符串末尾不以空格为结尾且字符串仅以字母,数组组成)
输入描述:
输入一行,代表要计算的字符串,非空,长度小于5000。
输出描述:
输出一个整数,表示输入字符串最后一个单词的长度。
示例1
输入:hello world
输出:5
说明最后一个单词为world,长度为5
思路一
字符串是类似数组的数据结构,既然字符串末尾没有空格,那我们只需要从字符串的末尾开始向前遍历(即从后向前遍历),遇到第一个空格结束即可。然后返回单词长度即可。
思路二
利用c++中cin库函数遇到空格就结束当前输入的特性,搭配while循环可以实现,一个单词一个单词输入的功能, 然后返回最后一个单词的长度即可,该方法不太算是利用算法的解题,更多的是对cin库函数相关细节的理解。
关键点
-
cin.get()这个方法是从当前输入流中获取一个字符,在 方法二 中是获取了当前输入流中的结束符(这里的目的是为了判断你是否输入回车) -
cin这个库函数遇到空格或者回车等结束符时就会停止并把结束符留在缓冲区,但是遇到空格cin在停止当前输入后,并不会返回任何值,而遇到回车后会停止当前输入,并返回1,两者要有所区别,只有理解了这一点,才能看懂 方法二 中while循环的判处判入条件。
c++代码实现1:利用for循环
#include <iostream>
#include <string>
using namespace std;
//方法一:使用一个单for循环
class Solution {
public:
//获取字符串最后一个单词的长度
int lenghtOfLastWord(string s) {
int count = 0; //计数器,用来计算最后一个单词的长度
//从字符串的末尾开始遍历,遇到第一个空格就结束
for (int i = s.length() - 1; i >= 0; i--) {
if(s.at(i) != ' ') //或者s[i]的方式获取单个字符
count++;
//当遇到空格则最后一单词读取完毕,返回长度
else return count;
}
return count;
}
};
int main() {
//测试一下
string s;
getline(cin,s);//获取输入流到s中
Solution s1;
cout << s1.lenghtOfLastWord(s);
return 0;
}
- 时间复杂度
- 空间复杂度 ---不考虑字符串所占用的空间
c++代码实现2:利用cin库函数
#include <iostream>
#include <string>
using namespace std;
// 方法二:利用库函数cin
int main() {
string s;
while(cin >> s) {//不停的读入单个单词
//当读取到回车时,说明该单词已经是最后一个单词了,跳出循环
if(cin.get() == '\n') break;
};
//while循环结束,返回最后一个单词的长度(此时s里的内容为最后一个单词)
cout << s.size();
return 0;
}
- 时间复杂度 ---不考虑s.size()方法所占用的时间
- 空间复杂度 ---不考虑字符串所占用的空间
总结
我相信 方法一 大家都能理解,但是 方法二 中关于while循环的部分很多人可能会有疑惑,下面我模拟一下while循环的部分(最好在看完上文 关键点 的前提下再看这部分)
-
执行到while语句的时候,会先执行括号里面的
cin >> s(即在键盘中键入字符的操作),这时候输入字符串,例如:“abc abcd”,输入”abc“后,当键入空格的时候,cin会停止当前输入 并清除当前输入流,但会保留空格这个结束符在输入流中,然会立马进入下一次输入(即继续执行while(cin << s)),但不会返回任何值,故此时while循环仍然没有进行判断,所以并不会进入while的循环体中,然后继续从头开始执行cin >> s语句,开始键入后面的"abcd"当输入完最后一个字母d之后,我们会键入回车,这时候cin函数会停止当前输入,保留回车这个结束符在输入流中,并且返回1,然后while循环判断为真,进入循环体,cin.get获取输入流中尾字符(即回车),然后if判断为真,break;语句跳出while循环,所以此时字符串s中的内容为最后一个单词,并不是我们输入的整个字符串。 -
可以发现其实整个while循环的过程中只进入过一次循环体(即键入回车的时候)