题目相关
【题目描述】
输入一个句子(一行),将句子中的每一个单词翻转后输出。
【输入】
只有一行,为一个字符串,不超过500个字符。单词之间以空格隔开。
【输出】
翻转每一个单词后的字符串,单词之间的空格需与原文一致。
【输入样例】
hello world
【输出样例】
olleh dlrow
【来源】
分析
注意题目要求的是将单词进行翻转而不是仅仅是将整句话进行翻转。语句中包含空格,我们可以使用gets()来进行输入。单词间的空格需与原文一致,我们可以在遇见空格时原样进行输出。
考虑采用枚举法进行字符串内容遍历,在遇见空格和结束时,能分离出被空格与结束符号分隔开的单词,再将单词进行逆置。
首先考虑遇见空格时的场景,先将前面的单词逆转输出,再原样输出空格。难点在于如何获取前面的单词的内容进行翻转。我们可以提前定义变量来记录单词开始的位置,在知道单词的开始结束位置之后就容易处理了。若开始位置为h,结束位置为t,我们来找找逆转的下标变化规律。
原位置 | 对称位置 |
---|---|
h | t |
h+1 | t-1 |
h+2 | t-2 |
i | t+h-i |
for(int i=h;i<=t;i++){
cout<<s[t+h-i];
}
接着来考虑结尾的判断,结束是以’\0’作为结束标志,我们可以对应的进行判断。之后过程和空格相差不大。
代码实现
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
char s[505]={0};
int h=0,t=0;
gets(s);
for(int i=0;s[i]!=0;i++){
if(s[i]==' '){
if(h<i){
for(int j=h;j<i;j++){
cout<<s[i+h-1-j];
}
}
cout<<s[i];
h=i+1;//更新单词开始位置
}
if(s[i+1]=='\0'){
if(h<i+1){
for(int j=h;j<=i;j++){
cout<<s[i+h-j];
}
}
}
}
return 0;
}