Day1
题目描述
计算字符串最后一个单词的长度,单词以空格隔开,字符串长度小于5000。(注:字符串末尾不以空格为结尾)
输入描述:
输入一行,代表要计算的字符串,非空,长度小于5000。
输出描述:
输出一个整数,表示输入字符串最后一个单词的长度。
示例1
输入:
hello nowcoder
复制
输出:
8
复制
说明:
最后一个单词为nowcoder,长度为8
思路:
- 正序遍历法,直接统计,找到最后单词前的一个空格,然后根据最后空格位置,直接向后遍历,知道字符串遍历完为止
- 逆序遍历法:逆序从字符串最后位置向前遍历,记录没遇到空格前的单词数,这个数字便是答案
复杂度
正序遍历法:Time: O(n) Space:O(n)
逆序遍历法:Time: O(n) Space:O(n),当只有一个单词的时候最坏时间复杂度为O(n)
具体实现
//计算字符串中最后一个单词的长度,单词以空格隔开,字符串长度小于5000,字符串末尾不以空格结尾
//day1
//法1:暴力法,直接正序统计
//时间复杂度:O(n),空间复杂度O(1)
//思路分析:
const int len = 5050;
int FindLastWorldInString(string s){
//边界条件,假如空串直接返回0
//if(s.length() == 0) return 0;
//if(c[0] == '\n') return 0;
if(s.length() == 0) return 0;
//先遍历找到最后空格的位置
//int lens = s.length();//先设置字符串长度
//int c_i = 0;//记录c遍历的位置
//int c_len = 0;//记录字符的长度
//int space_index;//记录最后出现空格的位置
//int ans; //记录最后单词的长度
int s_len = s.length();
int space_index = 0;//最后的空格位置
int ans = 0;//最后单词长度
//正序遍历
//统计空格出现的最后位置
for(int i = 0; i < s_len; i++){
if(s[i] == ' ') space_index = i;//找到最后空格位置
}
for(int i = space_index+1; i < s_len; i++){
ans++;
}
return ans;
}
//法2,逆序统计
/**
* @description: 时间复杂度O(n),空间复杂度O(n)
* @param {string} s
* @return {*}
*/
int FindLastWorldInStringII(string s){
if(s.length() == 0) return 0;
int s_len = s.length();
int ans = 0;//记录最后单词长度
//逆序统计,只要没到第一个出现的空格,那么就是最后单词所在位置
for(int i = s_len; i > 0; i--){
if(s[i] != ' ') ans++;
else break;
}
return ans;
}
int main(){
string s;
//用到getline
getline(cin,s);//将输入流直接赋给s字符串
int lastans = FindLastWorldInString(s);
printf("%d",lastans);
system("pause");
return 0;
}
小结
getline的使用,可以将cin输入流的字符直接赋给string字符类型