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;
}