字符串最后一个单词的长度
描述
计算字符串最后一个单词的长度,单词以空格隔开,字符串长度小于5000。
输入描述:
输入一行,代表要计算的字符串,非空,长度小于5000。
输出描述:
输出一个整数,表示输入字符串最后一个单词的长度。
首先,我们看下问题描述,计算最后一个单词的长度,那么我们脑海里面涌现的想法是:
- 这行字符串一定是通过某种方式隔开了每个单词,而我们最常见的隔开方式就是空格;
- 有了前面的认知,那我们就能够知道准确的找到最后一个单词;
- 通过什么方法能够准确的找到最后一个空格?
我们首当其冲想到的方法可能就是遍历一个数组,并且这个数组正着遍历可能会有一些麻烦,只能倒着遍历。
其次,看到字符串,我们是不是可以想一想其他的方法,比如说用一下std::string
类呢?
下面我们针对这两种情况分别来看看实现和运行情况:
1、倒着遍历字符串的方法
#include <iostream>
#include <string.h>
int main(int argc, char* argv[])
{
char data[5000] = {0};
char* pData = data;
fgets(data, sizeof(data), stdin);
int len = strlen(data) - 1;
if(len <= 0)
{
std::cout << 0 << std::endl;
return 0;
}
pData = pData + len - 1;
int count = 0;
for(int nIndex = 0; nIndex < len; ++nIndex)
{
if(*pData != ' ')
{
++count;
--pData;
continue;
}
break;
}
std::cout << count << std::endl;
return 0;
}
上面的代码相对来说还是比较简单的,从字符串的尾部进行单字符的遍历,如果字符不为空格,则计数加 1,知道遇到空格或者遍历结束(因为可能输入的就是一个单纯的单词),跳出循环。
看下它的运行效果:
运行时间3ms,占用内存:376KB
2、借用std::string类
std::string
其实在我们的日常工作中经常会用到,在C++11中,它是一个标准的模板类,有自己的成员函数和算法。那么怎么巧妙的借用std::string
类,能够实现上面的要求呢?
首先我们想到的还是遍历,倒着遍历,因此会有下面的实现:
#include <iostream>
#include <string>
int main(int argc, char* argv[])
{
std::string s;
getline(std::cin, s, '\n');
int count = 0;
for(auto itor = s.rbegin(); itor != s.rend(); ++itor)
{
if(tolower(*itor) == ' ')
{
break;
}
++count;
}
std::cout << count << std::endl;
return 0;
}
如上:我们借用了std::string
模版类的倒序迭代器进行了遍历。运行结果如下:
在测试的过程中,有一个发现,就是如果,将 std
域,通过在 main
函数之前申明,using namespace std;
,和上面的运行结果是有一点差别的。
上面的代码运行结束之后,突然有一种想法浮现,我们是不是可以通过借助string
类成员函数,使得整行字符串的长度 - 在这个字符串里面找到的最后一个空格的位置。这样的结果不就是剩下的最后一个单词再加最后一个空格的长度了吗?
于是,有了下面的验证:
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char* argv[])
{
string s;
getline(cin, s, '\n');
int count = s.length() -(s.rfind(' ') + 1);
cout << count << endl;
return 0;
}
运行结果:
有一点需要说明的是,上面的运行结果都是在自测运行的模式下得到的结果,如果在牛客网点击保存提交的结果则如下,下面的顺序分别对应上面的顺序。
通过上面的结果我们也能够看出,最后一种方法是运行结果相对比较好的。模板库和它自己的成员函数会是一个不错的选择。