总时间限制:
1000ms
内存限制:
65536kB
描述
输入一个句子(一行),将句子中的每一个单词翻转后输出。
输入
只有一行,为一个字符串,不超过500个字符。单词之间以空格隔开。
输出
翻转每一个单词后的字符串,单词之间的空格需与原文一致。
样例输入
hello world
样例输出
olleh dlrow
分析:
首先我们要翻转每个单词,我们是否可以不用一直想着怎么将每个单词翻转然后再将翻转完单词的整个字符串输出来,我们可以直接以将每个单词的起点和终点找到,然后将每个单词反向遍历输出(当然,空格位置不变)的思路来写,这样写步骤更为简单些。
关键思路:
1.我们可以记录每个单词的长度,以空格为标志记录每个单词的末尾,这样就可以找到每个单词的起点和终点。
2.我们以直接输出的方式来完成,无需改变原来的字符串,这样单词长度以及单词末尾这两个变量就不需要再用数组来记录,两个变量重复利用即可。
注意点:
1.我们需要仔细思考一下这个遍历单词的for循环中 j 的取值范围,否则很容易造成错位。
2.我们需要注意最后一个单词后面是没有空格的,这个字符串在字符数组中在最后是一个字符'\0',而我们以空格为标志来记录单词末尾位置,所以我们采取把'\0'变成字符空格的方式解决最后一个单词。
3.如果我们用 x 来记录每个单词的长度,那么当一个单词输出之后我们需要把 x 归0,防止下一个单词的长度与上一个单词的长度叠加。
下面是AC代码:
#include <stdio.h>
#include <string.h>
int main(){
char a[505];
gets(a);
int x=0;
int len=strlen(a);
a[len]=' ';//把最后一个单词后面的'\0'改为空格
for(int i = 0;i<=len;i++){//i要有等于len的时候
if(a[i]==' '){
for(int j = i-1;j>=i-x;j--){//反向遍历输出单词
printf("%c",a[j]);
}
if(i!=len){//最后一个单词后面不用输出空格
printf(" ");
}
x=0;//归0
}
else{
x++;
}
}
return 0;
}
以上代码不需要真正翻转单词,下面我再给出翻转单词后再一起输出的源代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(){
char a[505];
gets(a);
int k = 0,x,tmp;
int len=strlen(a);
a[len]=' ';
int m,n;
for(int i = 0;i<=len;i++){
if(a[i]==' '){
x=i-1;
for(m = x,n = i-k;;m--,n++){
if(n>=m){
break;
}
tmp=a[m];
a[m]=a[n];
a[n]=tmp;
}
k=0;
}
else{
k++;
}
}
for(int i = 0;i<len;i++){
printf("%c",a[i]);
}
return 0;
}