1 条题解

  • 0
    @ 2025-8-24 21:07:28

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar うっせぇわ
    全网0个人想学

    搬运于2025-08-24 21:07:27,当前版本为作者最后更新于2021-07-16 14:14:26,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    读题

    我们可以把题意简化成这样:

    输入一个字符串,输出第一个出现的最长和最短的单词。

    解题

    相信大家拿到这题后可以很快地想出来,我们需要发现一个单词,在单词中间记录信息,再对比信息

    那么怎样判断一个单词的开始结束

    我们阅读的时候,每个单词开始前都会有一个标点符号或空格提醒我们这是下一个单词,那么代码也一样,发现一个空格或标点符号,更新数据

    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记录,供参考

    • 1

    信息

    ID
    6978
    时间
    1000ms
    内存
    128MiB
    难度
    1
    标签
    递交数
    1
    已通过
    1
    上传者