题目描述
将一个英文语句以单词为单位逆序排放。例如“I am a boy”,逆序排放后为“boy a am I”。所有单词之间用一个空格隔开,语句中除了英文字母外,不再包含其他字符。
输入描述:
将一个英文语句以单词为单位逆序排放。
输出描述:
得到逆序的句子
输入例子:
I am a boy
输出例子:
boy a am I
解题思路
为了将字符串以单词为单位逆序,需要进行两步:第一步,将整个字符串反转;第二步,将每个单词进行反转。例如:原字符串为"I am a boy",第一步得到的字符串为"yob a ma I",第二步得到的是"boy a am I"。
可以编写一个函数,将字符串str指定范围[low,high]中的字符进行反转。第一步反转只需要令low=0,high=str.size()-1,再调用该函数即可。第二步需要先根据空格的位置,确定low和high,然后调用该函数。
代码
#include <iostream>
#include <string>
using namespace std;
void reverseByWord(string& str); //将字符串以单词为单位逆序
void reverseByChar(string& str, int low, int high); //将字符串在[low,high]范围内以字符为单位逆序
void swap(char &ch1, char &ch2);
int main()
{
string str;
getline(cin, str);
//reverseByChar(str, 0, str.size() - 1);
//cout << str << endl;
reverseByWord(str);
cout << str << endl;
return 0;
}
void reverseByWord(string& str)
{
//反转字符串
reverseByChar(str, 0, str.size() - 1);
//反转每个单词
int i = 0, j = 0;
while (i < str.size())
{
if (str.find(' ', i) == string::npos) //i后面找不到空格,表示已经到了字符串的最后一个单词
{
j = str.size() - 1;
}
else
{
j = str.find(' ', i) - 1;
}
reverseByChar(str, i, j);
i = j + 2;
}
}
void reverseByChar(string& str, int low, int high)
{
for (int i = low, j = high; i < low + (high - low + 1) / 2; ++i, --j)
{
swap(str[i], str[j]);
}
}
void swap(char &ch1, char &ch2)
{
char tmp = ch1;
ch1 = ch2;
ch2 = tmp;
}