输入有多组数据。 每组输入一个字符串(不大于100)然后输入n,再输入n条指令(指令一定有效)。
根据指令对字符串操作后输出结果。
bac 2 003 112as
cab cas
#include<iostream> #include<algorithm> #include<string> using namespace std; int main() { string str; int n; while(cin>>str>>n) { string command; for(int i=0;i<n;i++) { cin>>command; int flag =command[0]-48; int start =command[1]-48; int len =command[2]-48; command.erase(0,3); if(flag==0) { reverse(str.begin()+start,str.begin()+start+len); } else if(flag==1) { str.insert(start,command); str.erase(start+command.size(),len); } cout<<str<<endl; } } }
#include <bits/stdc++.h> using namespace std; int main() { string s,t; int i,j,k,n,f,len; while(cin>>s>>n) { for(j=0;j<n;j++) { cin>>t; f=t[0]-'0'; i=t[1]-'0'; len=t[2]-'0'; if(f==0) reverse(s.begin()+i,s.begin()+i+len); else s.replace(i,len,t.substr(3)); cout<<s<<endl; } } }
//不用string的replace函数来做 感觉很呆 #include <bits/stdc++.h> using namespace std; int main() { string str; int n = -1;//n条指令 string cmd; int strSize = -1; int cmdSize = -1; while(cin >> str) { strSize = str.size(); cin >> n; while(n--) { cin >> cmd; cmdSize = cmd.size(); if(cmdSize == 3 && cmd[0] == '0') { int i = cmd[1] - '0';//start int j = (cmd[1] - '0') + (cmd[2] - '0') - 1; char temp; while( i < j) { temp = str[j]; str[j] = str[i]; str[i] = temp; i++; j--; } } else if(cmd[0] == '1') { string str1(str,0,(cmd[1]-'0')); string str2(str,(cmd[1]-'0') + (cmd[2]-'0'),strSize - (cmd[1] - '0') - (cmd[2] - '0')); string str3(cmd,3,cmdSize - 3); str = str1 + str3 + str2; strSize = str.size(); } cout << str << endl; } } return 0; }
#include<iostream> #include<cstring> #include<vector> #include<algorithm> using namespace std; //字符0和数字0不能相提并论,这点卡了我好一会儿,多注意这些细节T_T int main(void) { string s; vector<string> t; while (cin >> s) { t.clear(); int n; cin >> n; for (int i = 0; i < n; i++) { string temp; cin >> temp; t.push_back(temp); } for (vector<string>::iterator it = t.begin(); it != t.end(); it++) { string a;//一条指令 a = *it; if (a[0] == '0')//翻转 { char i = a[1] - 48;//字符‘0’与数字0之间相差了48 char len = a[2] - 48; reverse(s.begin() + i, s.begin() + i + len);//倒转时不包括结束元素(第二个实参) cout << s << endl; } if (a[0] == '1')//替换 { char i = a[1] - 48; char len = a[2] - 48; char b = 3; if(i < s.length()) { string str_1; for(int k = b;k < a.size();k++) str_1.push_back(a[k]); s.replace(i,len,str_1);//用str_1替换从i开始的n个字符的子串(从0开始) cout << s << endl; } } } } return 0; }
#include<bits/stdc++.h> using namespace std; void Option(string& s, string o) { int op = o[0]-'0', start = o[1]-'0', len = o[2]-'0'; if(op == 0) reverse(s.begin()+start, s.begin()+start+len); else if(op == 1) s.replace(start, len, o.substr(3)); cout << s << '\n'; } int main() { ios::sync_with_stdio(false); string s, o; int n; while(cin >> s >> n) { while(n--) { cin >> o; Option(s, o); } } return 0; }
/*描述 读入一组字符串(待操作的),再读入一个int n记录记下来有几条命令,总共有2中命令: 1、翻转 从下标为i的字符开始到i+len-1之间的字符串倒序;2、替换 命中如果第一位为1, 用命令的第四位开始到最后的字符串替换原读入的字符串下标 i 到 i+len-1的字符串。 每次执行一条命令后新的字符串代替旧的字符串(即下一条命令在作用在得到的新字符串上)。 命令格式:第一位0代表翻转,1代表替换;第二位代表待操作的字符串的起始下标int i; 第三位表示需要操作的字符串长度int len。*/ #include<stdio.h> (737)#include<string.h> int main() { char a[200],b[100]; int n,m,i,len,j,k,c,len2;//两种方式 scanf("%s",a); scanf("%d",&n); for(j=0;j<n;j++)//n等于几处理几次 { //输入一个三位数 scanf("%d",&c); len=c%10;//个位代表需要操作的字符串长度 i=c/10%10;//十位代表字符串要操作的起始下标 m=c/100;//百位 0代表逆序翻转,1代表替换 if(m)//替换 { scanf("%s",b);//新增字符 strcpy(b+strlen(b),a+i+len);//把a需要操作的那一段之后不需操作的代码放在b数组的后面 strcpy(a+i,b);//从要操作的地方开始后面的全部用b替换 } else{//倒序i+k--i+len-1-k 范围为len的一半 len2=len/2; for(k=0;k<len2;k++) { char temp; temp=a[k+i]; a[k+i]=a[len+i-1-k]; a[len+i-1-k]=temp; } } puts(a); } return 0; }
#include <bits/stdc++.h> using namespace std; int main() { string str; while (cin >> str) { int n; cin >> n; string command; while(n != 0) { cin >> command; if (command[0] == '0') { for (int i = 0; i < (command[2] - '0') / 2; ++i) { char ch = str[i + command[1] - '0']; str[i + command[1] - '0'] = str[command[1] - '0' + command[2] - '0' - 1 - i]; str[command[1] - '0' + command[2] -'0' - 1 - i] = ch; } } else { str = str.substr(0, command[1] - '0') + command.substr(3) + str.substr(command[1] + command[2] - 2 * '0'); } cout << str << endl; n--; } } return 0; }
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (scanner.hasNext()){ String s = scanner.next(); int n = scanner.nextInt(); for (int i = 0; i < n; i++) { String instruction = scanner.next(); char[] array = instruction.toCharArray(); int start =array[1] - '0'; int len = array[2] - '0'; if (array[0]=='1'){ String replace = instruction.substring(3); String ss=s.substring(0,start)+replace+s.substring(start+len); s=ss; System.out.println(ss); }else { String replace = new StringBuilder(s.substring(start,start+len)).reverse().toString(); String ss=s.substring(0,start)+replace+s.substring(start+len); s=ss; System.out.println(ss); } } } } }
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
string tmp;
cin>>tmp;
int n;
cin>>n;
while(n--)
{
int num[3];
string strb;
cin>>strb;
if(strb[0]=='1')
{
int x = strb[1]-'0';
int lent = strb[2]-'0';
tmp = tmp.substr(0,x)+strb.substr(3,strb.size()-3)+tmp.substr(x+lent,tmp.size()-x-lent);
}
else
{
string tmpb;
for(int i=strb[1]-'0';i<strb[1]-'0'+strb[2]-'0';i++)
{
tmpb = tmp[i]+tmpb;
}
int x = strb[1]-'0';
int lent = strb[2]-'0';
tmp = tmp.substr(0,strb[1]-'0') + tmpb + tmp.substr(x+lent,tmp.size()-x-lent);
}
cout<<tmp<<endl;
}
return 0;
}
//事实证明STL库真是个好东西~ #include<iostream> #include<string> #include<algorithm> using namespace std; int main(){ string str; cin>>str; int n; cin>>n; string st; for(int j=0;j<n;j++){ cin>>st;//开始我一直企图用gets然后一直输不进去…现在我也不知道为什么,烦请大神不吝赐教 int i=st[1]-48;//字符串和数字的转化,超好用 int len=st[2]-48; if(st[0]-48==0){ reverse(str.begin()+i,str.begin()+i+len); cout<<str<<endl; } else{ st.erase(st.begin(),st.begin()+3); cout<<str.replace(str.begin()+i,str.begin()+i+len,st)<<endl; } } return 0; }
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scan = new Scanner(System.in); String s = scan.next(); int n = scan.nextInt(); for(int i = 0; i < n; i++) { String command = scan.next(); int second = command.charAt(1) - 48; int third = command.charAt(2) - 48; if(command.startsWith("0")) { s = s.substring(0, second) + new StringBuilder(s.substring(second, second + third)).reverse().toString() + s.substring(second + third); } else { s = s.substring(0, second) + command.substring(3) + s.substring(second + third); } System.out.println(s); } scan.close(); } }
#include <bits/stdc++.h> using namespace std; int main() { string s1; string s2; string s3; while(cin>>s1) { int n; cin>>n; for(int i = 1;i <= n;i++) { cin>>s2; s3 = s2; s3.erase(0,3); char a = s2[0]; int s = s2[1] - '0'; int e = s2[2] - '0'; if(a == '0') { for(int i = s,j = s + e - 1;i < s + e / 2;i++,j--) { char temp; temp = s1[i]; s1[i] = s1[j]; s1[j] = temp; } } else if(a == '1') { s1.insert(s + e,s3); // cout<<s1<<endl; s1.erase(s,e); } cout<<s1<<endl; } } }用C++类库超级方便
import java.util.Scanner; public class Main{ public void problem9(){ Scanner input = new Scanner(System.in); String strData = input.next(); int N = input.nextInt(); String order = null; int firstBit,startBit,lenBit; // 主循环 for(int i = 0 ;i < N ;i++){ order = input.next(); firstBit = Integer.valueOf(order.substring(0, 1)); startBit = Integer.valueOf(order.substring(1, 2)); lenBit = Integer.valueOf(order.substring(2, 3)); if(firstBit == 0){ String temp = strData.substring(startBit, lenBit+startBit); char[] mainChars = strData.toCharArray(); char[] subChars = temp.toCharArray(); for(int j = subChars.length-1 , index = startBit;j >= 0 ;j--,index++){ mainChars[index] = subChars[j]; } strData = String.valueOf(mainChars); System.out.println(strData); }else if(firstBit == 1) { String midStr = order.substring(3); String firstStr = strData.substring(0,startBit); String endStr = strData.substring(startBit+lenBit); strData = firstStr+midStr+endStr; System.out.println(strData); } } } public static void main(String[] args) { new Main().problem9(); } }java版本的解法
其中substring(a, b)方法求的是[a,b-1]子串
#include<iostream>
#include<cstring>
#define N 101
using namespace std;
int main()
{
char a[N];
while(cin>>a)
{
int k = strlen(a);//用来标记数组的长度,因为数组长度在后面会变化
int i;cin>>i;
for(int j = 0;j<i;j++)
{
char b[N];//a,b就只题目要求输入的两个字符串
cin>>b;
if(b[0]=='0')//翻转可能
{
int a1 = b[1] - '0';
int a2 = a1+b[2] - '0'-1;
for(int a3 = a1,a4 = a2;a4>a3;a3++,a4--)
{
int temp = a[a3];
a[a3] = a[a4];
a[a4] = temp;
}
}//-b[2]+'0'
else//替换可能
{
int b1 = strlen(b)-3-b[2]+'0';
if(b1>0)//这里数组长度增加
{
for(int m = k-1;m>=b[1]-'0';m--)
a[m+b1] = a[m];
k+=b1;
}
else{//数组长度降低
for(int m = b[1]+b[2]-'0'-'0';m<k;m++)
a[m+b1] = a[m];
k+=b1;
}
for(int m = b[1]-'0',n = 3;n<strlen(b);m++,n++)
{
// cout<<"a"<<endl;
a[m] = b[n];
}
}
for(int m = 0;m<k;m++)cout<<a[m];cout<<endl;
}
}
return 0;
}//题目挺简单的就是要求一步一步的算出来,祝好运,另点赞
#include<iostream> #include<cstdio> #include<cstring> #include<string> using namespace std; int i,len,l; void Reverse(char str[],int i,int l) { char c; int p,k; for(p=i,k=i+len-1;p<k;p++,k--) { c=str[p]; str[p]=str[k]; str[k]=c; } } void Replace(char str[],char s[]) { int p,l2; i=s[1]-'0'; len=s[2]-'0'; l2=strlen(s)-3; for(p=l;p>i;p--) str[p+l2-len]=str[p]; for(p=i;p<=i+l2-1;p++) str[p]=s[p-i+3]; } int main() { char str[204],s[100],r[22][102]; int j,n; while(gets(str)) { cin>>n; getchar(); for(j=1;j<=n;j++) { l=strlen(str); gets(s); if(s[0]=='0') { i=s[1]-'0'; len=s[2]-'0'; Reverse(str,i,len); }else if(s[0]=='1') Replace(str,s); //puts(str); strcpy(r[j],str); } for(j=1;j<=n;j++) puts(r[j]); } return 0; }
#include <iostream> #include <algorithm> using namespace std; int main() { string s,order[100]; int n; while(cin>>s>>n) { for(int i=0;i<n;i++)cin>>order[i]; for(int i=0;i<n;i++) { int option=order[i][0]-'0',start=order[i][1]-'0',length=order[i][2]-'0'; if(option==0) reverse(s.begin()+start,s.begin()+start+length); else s.replace(start,length,order[i].substr(3,order[i].length()-3)); cout<<s<<endl; } } return 0; }
while True:
try:
s, a = input(), int(input())
for i in range(a):
command = input()
start = int(command[1])
end = int(command[2]) + start
if command.startswith("0"):
s = s[:start] + s[start:end][::-1] + s[end:]
else:
s = s[:start] + command[3:] + s[end:]
print(s)
except:
break
#include<iostream> (720)#include<sstream> #include<algorithm> (831)#include<cstdio> #include<cstring> using namespace std; int main() { int n; string x; string q[100]; char z[100]; while (cin >> x >> n) { for (int i = 0; i < n; i++) cin >> q[i]; for (int i = 0; i < n; i++) { int a = q[i][1] - 48; int b = q[i][2] - 48; if (q[i][0] == '0') { reverse(x.begin() + a, x.begin() + a + b); //第一个参数起始位置(从零开始) ,第二个参数结束位置(到前一个) cout << x << endl; } else { string d; for (int j = 3; j < q[i].size(); j++) //替换给定范围字符串 d.append(1, q[i][j]); q[i].erase(0, 3); x.replace(a, b, q[i]); //atoi(d.c_str()); 字符串化整型 cout << x << endl; } } } }