题目描述
计算字符串最后一个单词的长度,单词以空格隔开,字符串长度小于5000。(注:字符串末尾不以空格为结尾)
输入描述:
输入一行,代表要计算的字符串,非空,长度小于5000。
输出描述:
输出一个整数,表示输入字符串最后一个单词的长度。
示例1
输入:
hello dayday
输出:
8
说明:
最后一个单词为dayday,长度为6
思路
思路一:将整个字符串的输入接收并存到一个string类型变量str中,从后往前进行遍历,每次进行一次遍历使计数count(初值为零)增一,当检测到空格时跳出循环(本次循环count不增)。难点在于普通的cin检测到空格时视为结束输入,需要更换读取输入方式。
思路二:在循环里一个一个字符读取,检测到空格时计数清零,非空格也非换行符时计数增一,检测到换行符时跳出循环并输出计数。
思路三:一个很巧妙的解法,来自于牛客题解,但是有些投机取巧。将cin写在while循环里,由于cin读到空格时会结束输入,所以第二个单词的输入会覆盖第一个单词,从而最后输出的是最后一个单词的长度。
思路四:使用Java系统函数split。
具体实现
思路一
C++
int main() {
string s;
int count = 0;
getline(cin,s);
for(int i=s.size()-1;i>=0;i--){
if(s[i]==' ') break;
count++;
}
cout<<count;
return 0;
}
Java
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
int length = str.length();
int count = 0;
for (int i = length - 1; i >= 0; i--) {
if (str.charAt(i)==' ') { // 或者 if (str.substring(i, i + 1).equals(" ")) {
break;
}
count++;
}
System.out.println(count);
}
思路二
C++
int main() {
char a;
int count = 0;
do {
a = getchar();
if (a == ' ') {
count = 0;
} else if (a != '\n') {
count++;
} else break;
} while (a != '\n');
cout << count;
return 0;
}
思路三
C++
int main() {
string s;
while(cin>>s);
cout<<s.size();
return 0;
}
思路四
Java
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
String[] s = str.split(" ");
int length = s[s.length - 1].length();
System.out.println(length);
}
时间复杂度
均为O(n)。
小结
对Java的相关函数的熟练度还不够,这次的Java代码基本都是参考别人写的,打算补一下Java基础,以后尽量用Java解题。