这种题目的描述一般是这样的:将一字符串的前几个字符移到这个字符串后面去。
常规的思路是,写一个将首字符移到末尾的函数,然后调用n次即可。但比较快捷的方法是,三步反转。
所谓三步反转,即将一个字符串分割成几个部分,每个部分分别反转,然后对整个字符串进行整体反转。
例子:
单词翻转
输入一个英文句子,翻转句子中单词的顺序。要求单词内的字符的顺序不变,句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。例如,若输入“I am s student.”, 则输出"student. a am I".
我们运用之前讲过的三步反转法,以空格作为分割的界限。
#include <iostream>
using namespace std;
void ReverseString(string &s,int from,int to){
while(from < to){
char c = s[from];
s[from++] = s[to];
s[to--] = c;
}
}
int main(){
string str;
getline(cin,str);
int start = 0;
for(int i=0;i<=str.length();i++){
if(str[i] == ' ' || i == str.length()){
ReverseString(str,start,i-1);
start = i+1;
}
}
ReverseString(str,0,str.length()-1);
cout<<str<<endl;
return 0;
}
下面我在用char数组来做一遍:
#include <iostream>
using namespace std;
void ReverseString(char *s,int from,int to){
while(from < to){
char c = s[from];
s[from++] = s[to];
s[to--] = c;
}
}
int main(){
char c[100];
fgets(c,100,stdin);
int start = 0;
for(int i=0;i<strlen(c);i++){
if(c[i] == ' ' || i==(strlen(c)-1)){
ReverseString(c,start,i-1);
start = i+1;
}
}
ReverseString(c,0,strlen(c)-2); //末尾有一个换行符
cout<<c;
return 0;
}