字符串的指定位置反转

35 阅读1分钟

题目描述

将一个字符串在指定位置p和q(p,q<=String.length)进行反转,并与原来字符串形成新的字符串输出。

例如hjskcl1423sfdd(p=5,q=9),输出:hjsk241lc3sfdd。

示例

image.png

思路

  • 法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){ //不在pq范围内的,正序输出 
				cout<<s[i];
			}else{ //在pq范围内的,倒序输出 
				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<<"pq已超过字符串长度";
		}
	}else{
		cout<<"p,q取值有误";
	}
	return 0;
}

小结

字符串默认从0开始,不是自己从1开始遍历就从1了!