1.题目
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。
2.示例
输入1: “the sky is blue”
输出1: “blue is sky the”
输入2: " hello world! "
输出2: “world! hello”
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
输入3: “a good example”
输出3: “example good a”
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
说明:
无空格字符构成一个单词。
输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
3.算法
(1)基本思想:
先用空格将句子分割成单个单词并按顺序存储,然后将这些单词进行反转.
(2) 基本思想:
先将整个句子反转,然后再单词内部进行反转.
4.C++代码
/*
Writer: Cainell
Time: 2020-5-15
*/
#include<bits/stdc++.h>
using namespace std;
/*
方法一:
基本思想:先用空格将句子分割成单个单词并按顺序存储,然后将这些单词进行反转
*/
string reverseString(string str,int size)
{
bool flag = false; //当前不是字母,即在单词外
int index = -1; //标志每个单词的开始位置
string tmp[100]; //用一个字符串数组将根据空格分隔得到的每个单词保存起来
string sub = ""; //用于存储将分割后的单词反向连接后得到的结果
int count = 0; //用于统计分割得到的单词数
for (int i = 0; i < size; i++)
{
if (str[i] != ' ')
{
if (flag == false)
{
index = i; //将index初始化为非空格字母的下标, 即单词的开始
flag = true;
}
if (i == size - 1) //由于最后一个单词后面没有空格,所以得特殊处理
{
tmp[count++] = str.substr(index, i - index+1);
}
continue;
}
else if(flag == true)
{
tmp[count++] = str.substr(index, i - index);
flag = false;
}
}
for (int i = count-1; i >= 0; i--)
{
sub += (tmp[i]+' ');
}
return sub;
}
/*
方法二:
基本思想:先将整个句子反转,然后再单词内部进行反转
*/
//反转整个字符串
void reverse(string &str, int start, int end){
char tmp = ' ';
int i = start;
int j = end;
for(; i < j;++i, --j){
tmp = str[i];
str[i] = str[j];
str[j] = tmp;
}
}
void reverseSentence(string &str){
int size = str.size();
reverse(str, 0 ,size - 1); //反转整个字符串
int flag = false;
int index = 0;
for(int i = 0;i<size;++i){
if(str[i]!=' '){
if(flag==false){ //进单词
flag = true;
index = i; //将index初始化为非空格字母的下标, 即单词的开始
}
if(i==size - 1){ //反转后的最后一个单词后面没有空格
reverse(str, index, i);
}
}else if(flag == true){ //出单词
flag = false;
reverse(str, index, i - 1); //此时i标记的是一个单词的结束位
}
}
}
int main(){
string s;
getline(cin, s);
int a = s.size();
string s1 = reverseString(s,a);
cout<<"方法一:"<<s1<<endl;
string s2 = s;
reverseSentence(s2); //无返回值
cout<<"方法二:"<<s2<<endl;
return 0;
}