题目:
给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中最后一个单词的长度。
单词是指仅由字母组成、不包含任何空格字符的最大子字符串。
这是第一次尝试直接在leetcode上提交代码,测试了两次终于成功了。
完整代码如下:
#include <iostream>
#include <vector>
#include<algorithm>
using namespace std;
class Solution {
public:
int lengthOfLastWord(string s) {
int length = s.length();
int i;
int j,k=-1;
int temp1=0;
for (i = length - 1; i >= 0; i--)
{
if (s[i] != ' ')
{
j=i;
temp1 = i;
cout << "temp1:" << temp1 << endl;
break;
}
}
for (j=temp1; j >= 0; j--)
{
if (s[j] == ' ')
{
k = j;
cout << "k:" << k << endl;
break;
}
}
int temp = temp1 - k;
return temp;
}
};
int main() {
Solution S;
string s = "aas";
int temp3 = S.lengthOfLastWord(s);
cout << "最后一个单词长度为:" << temp3 << endl;
return 0;
}
方法一.遍历:
这道题目的思路我是这样子想的,寻找最后一个单词长度。则我先从后往前遍历,找到第一个不是空格的地方,这个位置就是我最后一个单词的结尾了。然后再从结尾的地方往前找到第一个是空格的地方,这就是我单词的开头了。结尾减去开头即得到了最后一个单词的长度。
提交错误一次是由于代码函数初始化:
int j,k=-1;
开始时存在一个小问题:开始我将k赋初值为0;
对于输入字符串为:
s = "aas";
这种类型的由于从后往前没有空格,所以第一个for循环执行完单词头指向第一个元素,此时k=0;而最后一个字母为s[2],即temp=2。所以长度算出来会变成2.
所以为了针对这种内部没有空格的情况将k初值设置为-1.
方法二.split分离:
class Solution {
public int lengthOfLastWord(String s) {
String[] str = s.split(" ");
return str[str.length-1].length();
}
}
这个工具非常好用,但是好像比直接遍历更加费时。split将字符串按指定字符分割成一个个元素存入到数字中,然后读取该数组中最后一个元素的长度即可。
参考:
https://leetcode-cn.com/problems/length-of-last-word/solution/-by-xiang-xin-ming-tian-7-68n4/