• 最长最短单词


    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]!='')//扫描a串生成一个新的单词,然后测其长度,再与max、min对比 
    16     {
    17         if(a[i]==' '||a[i]==',')
    18         {
    19             if(f==1)// f=1表示当前遇到的分隔符前面有一个刚刚扫描形成的单词 
    20             {
    21                 b[j]='';
    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]='';
    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
    %s
    ",maxT,minT);
    45     return 0;
    46 }

    输入案例:

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

    输出案例:

    Universityddddddd
    I

    若干年后重新再做一次这个题目,有了新的思路:

     1 /*
     2 思路:
     3 (1)整体输入一整行字符串 
     4 (2)扫描整个字符串,把逗号变为空格
     5 (3)扫描字符串,遇到非空格字符a[i],则用sscanf从地址a+i输入一个字符串t。(t就是一个单词)
     6 (4)获取单词t的长度
     7 (5)用t的长度和历史最长、最短单词的长度做比较,如t更长或更短,则更新maxLen、minLen以及maxStr和minStr
     8 (6)输出maxStr和minStr 
     9 */
    10 #include<stdio.h>
    11 #include<string.h>
    12 int main()
    13 {
    14     int i=0,maxLen=-1,minLen=-1,len;
    15     char a[20500],t[200],maxStr[200],minStr[200];
    16     
    17     gets(a);
    18     //puts(a);
    19     while(a[i]!='')
    20     {
    21         if(a[i]==',') a[i]=' ';
    22         i++;
    23     }
    24     //puts(a);
    25     
    26     i=0;
    27     while(a[i]!='')
    28     {
    29         if(a[i]!=' ')
    30         {
    31             sscanf(a+i,"%s",t);
    32             //printf("%s ",t);
    33             
    34             len=strlen(t);
    35             if(maxLen==-1||minLen==-1)
    36             {
    37                 maxLen=minLen=len;
    38                 strcpy(maxStr,t);
    39                 strcpy(minStr,t);
    40             }
    41             else
    42             {
    43                 if(len>maxLen) { maxLen=len; strcpy(maxStr,t); }
    44                 if(len<minLen) { minLen=len; strcpy(minStr,t); }
    45             }
    46             
    47             i=i+len;
    48         }
    49         else i++;        
    50     }
    51     printf("%s
    %s
    ",maxStr,minStr);
    52     return 0;
    53 }
  • 相关阅读:
    MySql状态查看方法 MySql如何查看连接数和状态?
    MySQL连接数超过限制的解决方法
    JS正则表达式获取分组内容实例
    jquery data方法获取某个元素上事件
    javascript浮点数转换成整数三种方法
    ThinkPHP CURD方法中field方法详解
    python3.3使用tkinter实现猜数字游戏代码
    Expo大作战(二十四)--expo sdk api之Accelerometer
    Expo大作战(二十三)--expo中expo kit 高级属性(没干货)
    Expo大作战(二十二)--expo分离后的部署(expokit)
  • 原文地址:https://www.cnblogs.com/huashanqingzhu/p/5075332.html
走看看 - 开发者的网上家园