函数原型:
int lengthOfLastWord(char * s)
解析:
求最后一个单词的长度,我们有两种思路
第一种思路:
逆向求,先设置一个字符串下标index,定位到最后一个单词的最后一个字符。再一个设置长度变量n,从后向前遍历,直到遇到“空格”或者下标index小于0停止遍历,每次前移n++,最后返回长度变量n
关键1:如何定位到最后一个单词的最后一个字符?
定位到最后一个单词的最后一个字符,即定位到字符串中最后一个非空格字符。我们可以通过求字符串长度,先定位到字符串的最后一个字符。如果该字符是空格,那么下标index前移,直到遇到非空格字符。这样我们就可以定位到最后一个单词的最后一个字符
关键2:最后一个单词长度,即变量n如何求?
当我们定位到最后一个单词的最后一个字符时,只要继续前移直到遇到空格字符或者下标小于0,前移的次数就是变量n的值,即最后一个单词的长度
关键3:为什么关键2中前移停止条件包含下标小于0呢?
因为如果字符串中只有一个单词,第一个单词就是最后一个单词,那么前移永远无法遇到空格字符,就会变为死循环,要想停下来下标index必须大于0
int lengthOfLastWord(char * s){ //定位到最后一个单词的最后一个字符 int size = strlen(s); int index = size - 1; while (s[index] == ' ') { index--; } //设置长度变量n int n = 0; while (index >= 0 && s[index] != ' ') { index--; n++; } return n; }
第二种思路:
正向求,先设置好字符串下标index和长度变量n,初始值都为0。 从前向后遍历,直到遍历完最后一个字符。每次遇到非空格字符,要判断一下当前字符的前一个字符是否为空格字符(判断条件还要加上index下标大于0),如果是,则说明此时正在遍历的是一个新的单词,前面的已经遍历的一定不是最后一个单词,长度变量n要重置为0。如果不是,长度变量n++。最后返回n。
关键1:为什么判断前一个字符是否为空格字符时需要加上index>0
因为当判断第一个字符的前一个字符是否为空格字符时,s [ index - 1]会越界,s[ -1 ]不存在
int lengthOfLastWord(char* s) { int n = 0; int index = 0; while (s[index] != '\0')//从前向后遍历字符串 { if (s[index] != ' ') { if (index > 0 && s[index - 1] == ' ')//判断前一个字符是否为空格字符 { n = 0;//新单词,重置长度变量 } n++; } index++; } return n; }