最长最短单词

简介: 21:最长最短单词    总时间限制:1000ms  内存限制:65536kB描述    输入1行句子(不多于200个单词,每个单词长度不超过100),    只包含字母、空格和逗号。单词由至少一个连续的字母构成,    空格和逗号都是单词间的间隔。

21:最长最短单词
    总时间限制:1000ms  内存限制:65536kB
描述
    输入1行句子(不多于200个单词,每个单词长度不超过100),
    只包含字母、空格和逗号。单词由至少一个连续的字母构成,
    空格和逗号都是单词间的间隔。
    试输出第1个最长的单词和第1个最短单词。
输入
    一行句子。
输出
    两行输出:
    第1行,第一个最长的单词。
    第2行,第一个最短的单词。
样例输入
    I am studying Programming language C in Peking University
样例输出
    Programming
    I
提示
    如果所有单词长度相同,那么第一个单词既是最长单词也是最短单词。

 

分析:

这个题目思路是这样:先用gets函数输入整行字符串a,然后扫描a串分割出各个单词,依次比较新分割的单词的长度是否比已经发现的单词中最长、最短单词还要长或短,若是有需要在更新一经发现的最长、最短单词并更新最长、最短单词的长度。

这里关键是扫描、分割单词。由于空格和逗号都是单词的分隔符号,所以可以把他们两种符号一起处理。扫描分割的过程需要用标志性变量f。f=0表示当前遇到的分隔符(空格或逗号)是新单词之前的分隔符; f=1表示当前遇到的分隔符前面有一个刚刚扫描形成的单词,也就是已经扫描分割出一个单词,需要对该单词做处理(求长度newLen,用newLen和max、min比较)。注意:在处理完一个单词后需要把f重新设为0.

还要注意:输入的串的开头、结尾可能有分隔符,也可能没有分隔符。所以末尾单词不一定被拿来跟max和min作比较。需要在循环后单独处理。

代码如下:

 1 #include<stdio.h>
 2 #include<string.h>
 3 int main(int argc, char *argv[])
 4 {
 5     char a[20005],b[105],maxT[105]="",minT[105]="";
 6     int i,j;
 7     int max=-1,min=105,newLen;//表示当前已经发现的最长、最短单词的长度
 8     int f;
 9     
10     freopen("21.in","r",stdin);
11     gets(a);
12     i=0;
13     j=0;
14     f=0; // f=0表示当前遇到的分隔符(空格或逗号)是新单词之前的分隔符 
15     while(a[i]!='\0')//扫描a串生成一个新的单词,然后测其长度,再与max、min对比 
16     {
17         if(a[i]==' '||a[i]==',')
18         {
19             if(f==1)// f=1表示当前遇到的分隔符前面有一个刚刚扫描形成的单词 
20             {
21                 b[j]='\0';
22                 newLen=strlen(b);
23                 if(newLen>max) { max=newLen; strcpy(maxT,b); }
24                 if(newLen<min) { min=newLen; strcpy(minT,b); }
25                 f=0;
26                 j=0;
27             }
28         }
29         else
30         {
31             b[j]=a[i];
32             j++;
33             f=1;//开始或是正在构造一个单词 
34         }
35         i++;
36     }
37     
38     //处理末尾单词 
39     b[j]='\0';
40     newLen=strlen(b);
41     if(newLen>max) { max=newLen; strcpy(maxT,b); }
42     if(newLen<min) { min=newLen; strcpy(minT,b); }
43     
44     printf("%s\n%s\n",maxT,minT);
45     return 0;
46 }

输入案例:

   ,,,,,,,,,,,,,,,,,,,,,, I am studying    Programming,,,,,, languagefff C in Peking Universityddddddd

输出案例:

Universityddddddd
I

 

相关文章
|
4月前
|
存储 索引
|
4月前
|
算法 前端开发
不可能得到的最短骰子序列
不可能得到的最短骰子序列
39 0
|
11月前
|
算法 测试技术 C++
C++算法:最短回文串
C++算法:最短回文串
|
4月前
|
C++
最长特殊序列 Ⅰ(C++)
最长特殊序列 Ⅰ(C++)
25 0
|
4月前
|
自然语言处理
leetcode-720:词典中最长的单词
leetcode-720:词典中最长的单词
48 0
|
10月前
最长单词
最长单词
54 0
h0129. 最长单词 (5 分)
h0129. 最长单词 (5 分)
151 0
1265:【例9.9】最长公共子序列 2021-01-15
1265:【例9.9】最长公共子序列 2021-01-15
|
算法 BI
最长公共子序列(三 | 存在多个解的情况)
最长公共子序列(三 | 存在多个解的情况)