一些通过刷题学习c++的记录(7)——Leecode58 最后一个单词的长度

Leecode58 最后一个单词的长度

最后一个单词长度

正向遍历

先考虑从正向遍历 记录每一个单词的长度 如果是最后一个单词则输出;不是最后一个单词就重置单词长度

class Solution {
public:
    int lengthOfLastWord(string s) {
        int x=0;
        int w=0;//记录单词长度
        while(x<s.size()){
            if(s[x]!=' '){
                w++;
                x++;
            }
            else{
                while(s[x]==' '){
                    x++;
                }
                if(x==s.size()){
                    return w;//结尾是空格的情况
                }
                else w=0;
            }
        }
        return w;//结尾是单词的情况
    }
};

反向遍历

考虑是最后一个单词的长度 因此从字符串最后开始遍历会简单很多

class Solution {
public:
    int lengthOfLastWord(string s) {
        int x=s.size()-1;
        int w=0;
        while(s[x]==' '){
            x--;
        }
        while(s[x]!=' '){
            w++;
            x--;
            if (x<0) return w;//只有一个单词的情况:“hello”
        }
        return w;
    }
};

正向遍历(递归)

在一开始思考的时候还写了这个递归的做法 但时间和空间效率都比较低。

class Solution {
public:
    int lengthOfLastWord(string s) {
        return last(s,0);
    }
    int last(string s,int idx){
        int w1=0;//单词长度
        while(s[idx+w1]!=' '){
            w1++;
            if(idx+w1==s.size()){
                return w1;
            }
        }
        int k=0;//空格长度
        while(s[idx+w1+k]==' '){
            k++;
        }
        if(idx+w1+k==s.size()){
            return w1;//如果空格后没有单词,则输出
        }
        else{
            return last(s,idx+w1+k);//如果空格后还有单词,则以单词开头字母为idx递归
        }
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值