PTA、PAT說反話加強版

7-32 說反話-加強版(20 分)

給定一句英語,要求你編寫程序,將句中所有單詞的順序顛倒輸出。

輸入格式:

測試輸入包含一個測試用例,在一行內給出總長度不超過500 000的字符串。字符串由若干單詞和若干空格組成,其中單詞是由英文字母(大小寫有區分)組成的字符串,單詞之間用若干個空格分開。

輸出格式:

每個測試用例的輸出佔一行,輸出倒序後的句子,並且保證單詞間只有1個空格。

輸入樣例:

Hello World   Here I Come

輸出樣例:

Come I Here World Hello

審題很重要,題目說的是長度不超過50,0000的字符串,因此數組的大小不能設置的太小。

#include<stdio.h>
#include<string.h>
int main()
{
	char a[500001];//注意審題,原來寫的大小是100,只得了14分,改後19分 
	int i=0;
	gets(a);
	int l=strlen(a);
	int N=1;
	
	for(i=0;i<l;i++)//記錄單詞個數 
	{
		if(a[i]==' '&&a[i+1]!=' ')
		N++;
			
	}
	int t[N];
	int j=0;
	for(i=l-2;i>=0;i--)
	{
		if(a[i]==' '&&a[i+1]!=' ')
		{
				t[j]=i;
				j++;
		}
		
	}
	t[j]=-1;
	/*for(i=0;i<N;i++)
	{
		printf("%d ",t[i]);
	}
	printf("\n");
	for(i=0;i<j;i++)
	{
		int s=t[i]+1;
		while(1)
		{
			if(a[s]!=' ')
			{
				printf("%c",a[s++]);
			
			}
			else
				break;
		}
		printf(" ");
	}*/
	for(i=l-1;i>=0;i--)//倒序判斷,遇到單詞就輸出,注意最後一個單詞不能超出數組的邊界 
	{
		
		if(a[i]!=' '&&a[i-1]==' '||i==0)
		{
			int j=i;
			if(i==0)
			{
				while(a[j]!=' '&&j<l)
				{
				printf("%c",a[j++]);
				}
			
			}
			else
			{
				while(a[j]!=' '&&j<l)
				{
				printf("%c",a[j++]);
				}
				printf(" ");
			}
			
		}
	}

}

網上滿分答案

#include <stdio.h>  
#include <stdlib.h>  
#include"string.h"  
int main()  
{  
    int flag=0,n,count=0;  
    char *ch;  
    ch=(char *)malloc(500001*sizeof(ch));/*通過malloc把較大的數組放到堆區,防止爆棧*/  
    gets(ch);  
    n=strlen(ch)-1;  
    while(n)  
    {  
        if(ch[n]!=' ')  
            count++;  
  
  
        else  
        {  
  
            ch[n]='\0';  
            if(count)  
            {  
                if(flag)  
                    putchar(' ');  
                printf("%s",ch+n+1);  
                count=0;  
                flag=1;  
            }  
  
        }  
  
        n--;  
  
  
    }  
    if(flag&&count)  
       putchar(' ');  
    if(count)  
        printf("%s",ch);  
    putchar('\n');  
  
    return 0;  
}  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章