最長最短單詞


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

 

若干年后重新再做一次這個題目,有了新的思路:

 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]!='\0')
20     {
21         if(a[i]==',') a[i]=' ';
22         i++;
23     }
24     //puts(a);
25     
26     i=0;
27     while(a[i]!='\0')
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\n%s\n",maxStr,minStr);
52     return 0;
53 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM