算法训练打卡day1 2023.1.8
题目描述
计算字符串最后一个单词的长度,单词以空格隔开,字符串长度小于5000。
输入描述:
输入一行,代表要计算的字符串,非空,长度小于5000。
输出描述:
输出一个整数,表示输入字符串最后一个单词的长度。
示例1
输入:
i love you
输出:
3
说明:
最后一个单词为you,长度为3
思路1
从字符串末尾向前遍历,遇到空格停止遍历,返回长度
具体实现
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str;
getline(cin,str); //输入字符串,并存入str
int n=0,flag=1; //n用来保存最后一个单词长度,flag作为非空标志,flag=0表示非空
for(int i=str.length()-1;i>=0;i--)
{
if(flag&&str[i]==' '){ //最后一个字符为空格,跳出当前循环,强迫开始下一个循环
continue;
}
else if (str[i]!=' '){ //第i+1个字符(str[i])非空格时,长度n加一,flag置0
flag=0;
n++;
}
else
{
break;
}
}
cout<<n<<endl;
return 0;
}
时间复杂度
O(n)
思路2
利用cin库函数,cin只能读取空格前面的字符串,遇到字符串会停止,而cin.getline()函数和cin.get()函数这两个函数都读取一行输入,直到达到换行符。但是,随后getline将丢弃换行符(用空字符代替),而get会保留换行符在输入序列,我们这里利用cin.get和cin的特点,cin可以使str中始终保存的是最后一个空格之后的单词,而cin.get()用来检测回车(即整个字符串的输入结束),此时str中保存的即为最后一个单词。最后输出str的长度即可
具体实现
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str;
while(cin >> str) {
if(cin.get() == '\n') break;
};
cout << str.size();
return 0;
}
时间复杂度
O(1)
小结
算法二更为简介,时间复杂度更低,但算法一更易想到。