本篇博客会讲解力扣“58. 最后一个单词的长度”的解题思路,这是题目链接。
以示例2为例:s = " fly me to the moon "
首先,找到字符串末尾的\0。s一开始指向首字符f,我们从这个位置开始,向后遍历,直到遇到\0。我们让一个指针end指向字符串末尾的\0,再往前走一步,end就指向了字符串除了\0之外的最后一个字符,在这个例子中,指向了最后一个空格。
接着,从end位置开始,从后往前遍历字符串,跳过字符串末尾的空格,因为空格不属于单词的一部分,直到遇到第一个不是空格的字符位置,此时end指向了moon的最后一个n。
最后,再定义一个指针p,从end位置开始向前遍历,直到遇到空格或者字符串的起始位置s,此时p指向了最后一个单词的前一个空格,或者字符串的起始位置。此时end和p两个指针作差,就能得到最后一个单词的长度。
int lengthOfLastWord(char * s){
// 找\0的前一个字符
char* end = s;
while (*end)
{
++end;
}
--end;
// 跳过空格
while (*end == ' ')
{
--end;
}
// 倒着往回找空格
char* p = end;
while (p >= s && *p != ' ')
{
--p;
}
return end - p;
}
总结
求解最后一个单词的长度,只需要从\0开始向前遍历,跳过字符串末尾的空格,找到最后一个单词的最后一个字母。接着,从这个位置开始向前遍历字符串,找到最后一个单词的前一个空格,或者字符串的起始位置。有了最后一个单词的最后一个字母的位置和第一个字母的位置,我们用两个指针记录这两个位置,再作差,就能得到最后一个单词的长度。
感谢大家的阅读!