58 最后一个单词的长度
最近家里面有人住院,作为家里每天没什么事情的劳动力就每天都被拉去陪床,回家很晚了,所以练习又开始 断断续续的写了,但有时间还是不能断的。
今天的练习题目是:给定一个仅包含大小写字母和空格 ’ ’ 的字符串,返回其最后一个单词的长度。如果不存在最后一个单词,请返回 0 。
初看到这个题目时,想法是读出空格所在的字符位置,然后总长度减去空格所在字符的位置再减去1就是后面剩余单词的长度了。
这种想法就要将情况考虑全面,要考虑最后一个或者几个是否是空格,考虑单词和单词中间可能不止有一个空格,或者整个句子中没有空格的情况:
class Solution {
public:
int lengthOfLastWord(string s) {
int len=s.length();
int k=0;//记录某个空格前面字符的数量
int n=0;//记录空格的数量
int local=0;//记录位置(即最后一个单词的数量)
while(s[len-1]==' ')//考虑最后一个或几个字符是空格
len=len-1;
for(int i=0;i<len;i++){
if(s[i]!=' ')
k++;
else{
n++; //需要考虑中间可能不止一个空格或者全是空格
local=len-k-n;
}
}
if(k==len) //考虑没有空格
return len;
return local;
}
};
运行结果:
(小声BB:其实我第一次运行时时间更短,但后面怎么也运行不出来了嘤嘤嘤
)
之后看各位大佬解答,发现有两个思路值得借鉴:
方法一:
class Solution {
public:
int lengthOfLastWord(string s) {
if(s.empty()) return 0;
int pos=s.find_last_of(' ');//寻找到最后一个空格
while(pos==s.length()-1)//将末尾的空格全部删除
{
if(s.empty()) return 0;
s.erase(pos);
pos=s.find_last_of(' ');
}
return s.length()-pos-1;
}
};
其实最后的操作和我的想法相同,但里面用了一个erase——用于去除找到的空格,和ss.find_last_of()——用于找到最后一个空格的位置。
执行后:
方法二:运用字符串流,直接自动过滤空格并且得到单词。
class Solution {
public:
int lengthOfLastWord(string s)
{
string word;
stringstream ss(s);//字符串输入输出流自动过滤空格
while(ss>>word){}//读取到最后一个单词
return word.size();
}
};