为什么我要给出完整解答,因为要搜索个题目的解答,很多都偷懒只给个方法的实现,结果跑都跑不起来。于是我就决定,每一题,都给出Java&C两种完整的解答,直接就可以运行,Debug。
题目链接:
最后一个单词的长度
给定一个仅包含大小写字母和空格 ’ ’ 的字符串,返回其最后一个单词的长度。
如果不存在最后一个单词,请返回 0 。
说明:一个单词是指由字母组成,但不包含任何空格的字符串。
示例:
输入: “Hello World”
输出: 5
- 一、Java完整版
/**
* 画解算法:58. 最后一个单词的长度
* 思路
* 标签:字符串遍历
* 从字符串末尾开始向前遍历,其中主要有两种情况
* 第一种情况,以字符串"Hello World"为例,从后向前遍历直到遍历到头或者遇到空格为止,即为最后一个单词"World"的长度5
* 第二种情况,以字符串"Hello World "为例,需要先将末尾的空格过滤掉,再进行第一种情况的操作,即认为最后一个单词为"World",长度为5
* 所以完整过程为先从后过滤掉空格找到单词尾部,再从尾部向前遍历,找到单词头部,最后两者相减,即为单词的长度
* 时间复杂度:O(n),n为结尾空格和结尾单词总体长度
*
* 作者:guanpengchn
* 链接:https://leetcode-cn.com/problems/two-sum/solution/hua-jie-suan-fa-58-zui-hou-yi-ge-dan-ci-de-chang-d/
* 来源:力扣(LeetCode)
* 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
*/
public class Main {
public static void main(String[] args) {
String str = "Hello World! ";
int result = lengthOfLastWord(str);
System.out.println(result);
}
public static int lengthOfLastWord(String s){
//字符串的末尾
int end = s.length() -1;
//从尾向头遍历
//charAt() 方法用于返回指定索引处的字符。索引范围为从 0 到 length() - 1。
//去掉末尾的空格
while (end >= 0 && s.charAt(end) == ' '){
end--;
}
//如果小于0直接返回0
if (end < 0){
return 0;
}
//使start头和尾相等
int start = end;
//如果字符串s在start处的值不为空串,start前移
while (start >= 0 && s.charAt(start) != ' '){
start--;
}
return end - start;
}
}
- 二、C完整版
#include <stdio.h>
/**
* 画解算法:58. 最后一个单词的长度
* 思路
* 标签:字符串遍历
* 从字符串末尾开始向前遍历,其中主要有两种情况
* 第一种情况,以字符串"Hello World"为例,从后向前遍历直到遍历到头或者遇到空格为止,即为最后一个单词"World"的长度5
* 第二种情况,以字符串"Hello World "为例,需要先将末尾的空格过滤掉,再进行第一种情况的操作,即认为最后一个单词为"World",长度为5
* 所以完整过程为先从后过滤掉空格找到单词尾部,再从尾部向前遍历,找到单词头部,最后两者相减,即为单词的长度
* 时间复杂度:O(n),n为结尾空格和结尾单词总体长度
*
* 作者:guanpengchn
* 链接:https://leetcode-cn.com/problems/two-sum/solution/hua-jie-suan-fa-58-zui-hou-yi-ge-dan-ci-de-chang-d/
* 来源:力扣(LeetCode)
* 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
*/
int main() {
char s[] = "hello world ";
int lengthOfLastWord(char * s);
int result = lengthOfLastWord(s);
printf("%d",result);
return 0;
}
int lengthOfLastWord(char * s){
int wordLenth = 0;
int wordLengthCount = 0;
//判断是否到了字符串的结尾处
while (*s != '\0'){
//判断结尾处的字符是否是空字符
while (*s != ' '){
while ((*s != ' ') && (*s != '\0')) {
//当结尾处的字符串既不是空串也不是结束符'',进行最后一个字符串的计数
wordLengthCount++;
wordLenth = wordLengthCount;
s++;
}
//如果s++后到达了结束符号'\0',返回wordLenth
if (*s == '\0'){
return wordLenth;
}
//当*s == ' '时候,要置零,重新循环
s++;
wordLengthCount = 0;
}
if (*s == '\0'){
return wordLenth;
}
s++;
}
return wordLenth;
}
好了,祝大家都能成为算法大神。