题目描述
将一个字符串在指定位置p和q(p,q<=String.length)进行反转,并与原来字符串形成新的字符串输出。
例如hjskcl1423sfdd(p=5,q=9),输出:hjsk241lc3sfdd。
示例
思路
-
法1:遍历字符串s,若范围在p,q之间,则逆序输出(下标从q开始到p,i--);其余的正序输出。
-
法2:比法1简单些,直接把范围分三段:0到p-1,正序输出;p到q,逆序输出;q+1到字符串长度-1,正序输出。
具体实现
法1
#include<bits/stdc++.h>
using namespace std;
int main(){
string s;
int p,q;
cin>>s>>p>>q;
p-=1;
q-=1;
int ls = s.size();
if(p<=ls && q<=ls){
for(int i=0; i<ls; i++){
if(i<p || i>q){ //不在p,q范围内的,正序输出
cout<<s[i];
}else{ //在p,q范围内的,倒序输出
while(p<q){
int j;
for(j=q; j>=p; j--){
cout<<s[j];
}
if(j<p){
break;
}
}
i=q; //不然会一直while循环
}
}
}else{
cout<<"输入的p,q大小不对";
}
return 0;
}
法2
#include<bits/stdc++.h>
using namespace std;
int main(){
string s;
int p,q;
cin>>s>>p>>q;
p-=1;
q-=1;
int ls = s.size();
if(p<q){
if(p<ls && q<=ls){
for(int i=0; i<p; i++){ //输出0~p,正序
cout<<s[i];
}
for(int i=q; i>=p; i--){ //输出p~q,逆序
cout<<s[i];
}
for(int i=q+1; i<ls; i++){ //输出q到ls-1,正序
cout<<s[i];
}
}else{
cout<<"p,q已超过字符串长度";
}
}else{
cout<<"p,q取值有误";
}
return 0;
}
小结
字符串默认从0开始,不是自己从1开始遍历就从1了!