题目链接
1009 说反话
题目描述
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用 1 个空格分开,输入保证句子末尾没有多余的空格。
输出格式:
每个测试用例的输出占一行,输出倒序后的句子。
输入样例:
Hello World Here I Come
输出样例:
Come I Here World Hello
题目大意
给出一个英文句子,将每个单词的位置倒转
解题思路
首先要区分三种输入格式
- cin,可以输入string类型,也可以输入char数组,会被输入的空格打断
- getline(cin,string类型变量,‘遇到哪个字符停止’)是对string类型的输入,空格会被记入
- cin.getline(char类型变量,规定长度),是对char类型的输入,空格不会被打断,可以规定输入的长度
具体的使用方法可以看这篇文章【经验】关于区分cin、getline、cin.getline三种字符串输入的区别
然后就是对于当前单词的首字母和尾字母的表示,按字符串逆序遍历
i
代表当前位置j
表示当前要表示字母的最后一个位置temp
表示遍历输出本字母
当碰到第一个空格时,i j temp
表示的位置如图所示
当输出完成时
j
的位置变为i
的前一个位置,指向下一个要表示字母的最后一个位置
其他字母的输出同理
题解
#include<bits/stdc++.h>
using namespace std;
int main(){
string s;
getline(cin,s); //用getline函数对带空格的字符串进行输入
int j=s.length()-1; //j用来记录当前单词的最后一个字母
for(int i=s.length()-1;i>=0;i--){ //i用于记录当前指向
if(s[i]==' '){
//当s[i]为空格时,说明这个单词已经结束了,i+1表示当前单词的第一个字母,j表示当前单词的最后一个字母
for(int temp = i+1;temp<=j;temp++) cout<<s[temp];
cout<<" ";
j=i-1; //更新j为下一个要输出的单词的最后一个字母
}
else if(i==0){
//当i=0时说明已经是字符串的一地个单词了,即要输出的最后一个单词
//这时i代表当前单词的第一个字母,j表示当前单词的最后一个字母
for(int temp = i;temp<=j;temp++) cout<<s[temp];
}
}
}