Day1计算字符串最后一个单词的长度

248 阅读2分钟

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;
}

image.png

小结

getline的使用,可以将cin输入流的字符直接赋给string字符类型