题目:
Given a string s consists of upper/lower-case alphabets and empty space characters ' '
, return the length of last word in the string.
If the last word does not exist, return 0.
Note: A word is defined as a character sequence consists of non-space characters only.
For example,
Given s = "Hello World"
,
return 5
.
返回字符串里最后一个单词的长度。
思路:从字符串的第一个字符开始计数cnt, 遇到空格并且空格后有其他字符,重置cnt.直到没有其他字符.
Attention:考虑三种情况,normal"a bc def" ; " a bc def" ; "a bc def ";
复杂度:o(n)
AC Code: my_code
class Solution {
public:
int lengthOfLastWord(const char *s) {
//返回字符串里最后一个单词的长度。
//思路:从字符串的第一个字符开始计数cnt, 遇到空格并且空格后有其他字符,重置cnt.直到没有其他字符.
//Attention:考虑三种情况,normal"a bc def" ; " a bc def" ; "a bc def ";
int ret;
int cnt = 0;
bool ltag = false; //标记前面有一个word
bool spctag = false;
if(*s == NULL)
return 0;
//循环直到到达s最后一个字符
while(*s != '\0')
{
if(*s != ' ')
{
if(!spctag)
{ cnt++; }
else
{
cnt = 1;
spctag = false;
}
}
else
{ spctag = true; }
s++;
}
ret = cnt;
return ret;
}
};
***解法二:more neater code
思路:同上
复杂度:o(n)
Attention:
1. 字符串为空则 *s为false. 结束符'/0'(一般是NUL,ASCII代码是0) 。可以用while(*s)判断是否到字符串结尾。
2. *s++ 解引用运算符“*”的优先级低于后自增运算符“++” ; *s++ 相当于 *(s++); 后自增: x++ 相当于(tmp = x, x++, return tmp)
3. 无论是否执行条件控制里的语句块,但是条件总是会执行和判断的。code中总是会执行*s++,所以else if中判断的s已经是移位后的字符了,需要判断是否是字符末尾。
AC Code:
class Solution {
public:
int lengthOfLastWord(const char *s) {
int len = 0;
//字符串为空则 *s为false. 结束符'/0'(一般是NUL,ASCII代码是0)
while(*s)
{
//即使条件不成立,但仍然会执行条件的语句,*s++ 解引用运算符“*”的优先级低于后自增运算符“++”
if(*s++ != ' ')
{ len++; }
//置零的条件,不是字符串结束符,并且不是空格。由于上一个条件已经进行了*s++,所以此时的指针已经指向下一个字符,所以要判断此时不是s末尾。
else if(*s && *s != ' ')
{ len = 0;}
}
return len;
}
};