B2121 最长最短单词 题解
读题
我们可以把题意简化成这样:
输入一个字符串,输出第一个出现的最长和最短的单词。
解题
相信大家拿到这题后可以很快地想出来,我们需要发现一个单词,在单词中间记录信息,再对比信息。
那么怎样判断一个单词的开始与结束?
我们阅读的时候,每个单词开始前都会有一个标点符号或空格提醒我们这是下一个单词,那么代码也一样,发现一个空格或标点符号,更新数据。
for(int i=0;i<a.length();i++){
if(a[i]==' '||a[i]==','||a[i]=='.'){
更新数据;
}
单词长度++;
}
如何更新数据?
我设置了两个变量,一个记录最长单词的结束位置,一个记录最长单词的长度,这样输出时我们就可以用结束位置-长度找到开始位置,并且输出。最小值也一样。
目前基本思路已经想出来了,以下是代码:
#include <iostream>
#include <string>
using namespace std;
string a;
int sum=0,maxx=-100,maxb,minb,minn=1000000;
int main(){
getline(cin,a);//带空格输入
for(int i=0;i<a.length();i++){
if(a[i]==' '||a[i]==','||a[i]=='.'){//如果发现标点符号和空格,代表单词结束
if(maxx<sum){//如果单词长度突破目前发现的最长长度
maxb=i;//把最长单词的结束点更新,i就是结束点
maxx=sum;//把最长单词的长度更新
}
if(minn>sum){//如果单词长度低于目前发现的最短长度
minb=i;//更新最短单词结束点
minn=sum;//更新最短长度
}
sum=0;//sum清空,以便下次操作
}else{
sum++;//如果是字母,长度加一
}
}
for(int i=maxb-maxx/*从开始位置开始输出*/;i<maxb/*到结束位置结束*/;i++){
cout<<a[i];
}
cout<<endl;
for(int i=minb-minn;i<minb;i++){//最短单词同理
cout<<a[i];
}
return 0;
}
AC记录,供参考