题目描述:
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过500 000的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用若干个空格分开。
输出格式:
每个测试用例的输出占一行,输出倒序后的句子,并且保证单词间只有1个空格。
输入样例:
Hello World Here I Come
输出样例:
Come I Here World Hello
时间限制:300 ms
内存限制:64 MB
注:以上为原题描述,版权归属:
作者:陈越
单位:浙江大学
我的思路:
思路1:直接用指针数组顺序存储每个单词,然后逆序输出;
思路2:消除源字符串单词前后的空格,使单词间只保留一个空格,然后用指针数组顺序存储每个单词,逆序输出;
思路3:先消除源字符串单词前后的空格,使单词间只保留一个空格,然后将每个单词反转过来,最后逆序输出字符串(如果将字符串再反转过来,然后puts(),会运行超时)。
本题易错点:
char str[500001],而不能是char str[500000](调了一晚上,都是最大句子测试点运行时错误,哭了~),最后那一个字符存储 ‘\n’。
思路1-代码实现:
#include<stdio.h>
#include<string.h>
int getString(char * source , char *strPtr[]);
int main()
{
char str[500001];
int i, num ;
char *strPtr[125001]={0};
//或者:char *strPtr[125001]={"\0"};
gets(str);
num = getString(str, strPtr);
for(i = num-1 ; i > 0; i--)
{
printf("%s ",strPtr[i]);
}
printf("%s\n",strPtr[0]);
return 0;
}
int getString(char *source,char *strPtr[])
{
int j;
if(*source!=' ')
{
strPtr[0] = &source[0];
j=1;
}
else
{
j=0;
}
for(int i=0;source[i]!='\0';i++)
{
if(source[i]==' ')
{
//单词的前一个空格
if(source[i+1]!='\0'&&source[i+1]!=' ')
{
strPtr[j++] = &source[i+1];
source[i]='\0';
}
//单词的后一个空格
if(i>0&&source[i-1]!=' ')
{
source[i]='\0';
}
}
}
if(j==0)
{
strPtr[0]="\0";
}
/*如果前面是char *strPtr[125001]={"\0"},就不需要if(j==0) strPtr[0]="\0";这一步。*/
return j;
}
思路2-代码实现:
#include<stdio.h>
#include<string.h>
int getString(char * source , char *strPtr[]);
int main()
{
char str[500001];
int i, num ;
char *strPtr[125001]={0};
gets(str);
num = getString( str, strPtr ) ;
for(i = num-1 ; i > 0; i--)
{
printf("%s ",strPtr[i]);
}
printf("%s\n",strPtr[0]);
return 0;
}
int getString(char *source,char *strPtr[])
{
for(int i=0;source[i]!='\0';i++)
{
if(source[i]==' ') //功能:使一个单词的前面或后面只留一个空格
{
if(source[i+1]==' ')
{
for(int j=i+1;source[j]!='\0';j++)
{
source[j]=source[j+1];
}
i--;
}
}
}
if(source[strlen(source)-1]==' ') //消除字符串尾空格
{
source[strlen(source)-1]='\0';
}
if(*source==' ') //消除字符串首空格
{
source+=1;
}
strPtr[0] = &source[0];
int j=1;
for(int i=0;source[i]!='\0';i++)
{
if(source[i]==' ')
{
strPtr[j++] = &source[i+1];
source[i]='\0';
}
}
return j;
}
思路3-代码实现:
#include<stdio.h>
#include<string.h>
int main()
{
char str[500001];
gets(str);
int i,j;
for(i=0;str[i]!='\0';i++)
{
if(str[i]==' ') //功能:使一个单词的前面或后面只留一个空格
{
if(str[i+1]==' ')
{
for(j=i+1;str[j]!='\0';j++)
{
str[j]=str[j+1];
}
i--;
}
}
}
if(str[strlen(str)-1]==' ') //消除字符串尾空格
{
str[strlen(str)-1]='\0';
}
if(str[0]==' ') //消除字符串首空格
{
for(i=0;str[i]!='\0';i++)
{
str[i]=str[i+1];
}
}
//逆转每个单词
int head=0, tail, p;
char t;
for(i=0;str[i]!='\0';i++)
{
if(str[i]==' ')
{
tail=i-1;
p=tail;
for(j=head;j<=(head+tail)/2;j++)
{
t=str[j];
str[j]=str[p--];
str[p+1]=t;
}
head=i+1;
}
}
/*或者:
//逆转每个单词
int head=0, tail, p;
char t;
for(i=0;str[i]!='\0';i++)
{
if(str[i]==' ')
{
tail=i-1;
p=tail;
if(tail-head>0)
{
for(j=head;j<=(head+tail)/2;j++)
{
t=str[j];
str[j]=str[p--];
str[p+1]=t;
}
head=i+1;
}
else
{
head=i+1;
}
}
}
*/
//逆转最后的单词
tail=strlen(str)-1;
p=tail;
if(tail-head>0)
{
for(j=head;j<=(head+tail)/2;j++)
{
t=str[j];
str[j]=str[p--];
str[p+1]=t;
}
}
for(i=strlen(str)-1;i>=0;i--)
{
printf("%c",str[i]);
}
printf("\n");
return 0;
}