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 }