http://noi.openjudge.cn/——3.9数据结构之C++STL——【3342:字符串操作】

题目

3342:字符串操作

查看提交统计提问

总时间限制: 1000ms 内存限制: 65536kB

描述

给定n个字符串(从1开始编号),每个字符串中的字符位置从0开始编号,长度为1-500,现有如下若干操作:

copy N X L:取出第N个字符串第X个字符开始的长度为L的字符串。

add S1 S2:判断S1,S2是否为0-99999之间的整数,若是则将其转化为整数做加法,若不是,则作字符串加法,返回的值为一字符串。

find S N:在第N个字符串中从左开始找寻S字符串,返回其第一次出现的位置,若没有找到,返回字符串的长度。

rfind S N:在第N个字符串中从右开始找寻S字符串,返回其第一次出现的位置,若没有找到,返回字符串的长度。

insert S N X:在第N个字符串的第X个字符位置中插入S字符串。

reset S N:将第N个字符串变为S。

print N:打印输出第N个字符串。

printall:打印输出所有字符串。

over:结束操作。

其中N,X,L可由find与rfind操作表达式构成,S,S1,S2可由copy与add操作表达式构成。

输入

第一行为一个整数n(n在1-20之间)

接下来n行为n个字符串,字符串不包含空格及操作命令等。

接下来若干行为一系列操作,直到over结束。

输出

根据操作提示输出对应字符串。

样例输入

3

329strjvc

Opadfk48

Ifjoqwoqejr

insert copy 1 find 2 1 2 2 2

print 2

reset add copy 1 find 3 1 3 copy 2 find 2 2 2 3

print 3

insert a 3 2

printall

over

样例输出

Op29adfk48

358

329strjvc

Op29adfk48

35a8

ac代码

#include <bits/stdc++.h>

using namespace std;

int m;//字符串数

string s[21];//字符串

int tod(string s){//转换成整数

int sd=0;

for(int i=0;i<s.length();i++)

sd=sd*10+(s[i]-'0');

return sd;

}

string tos(int d){//转换成字符串

string s="";

while(d){

s=char(d%10+'0')+s;

d/=10;

}

return s;

}

bool ok(string s){//判断是否5位内的数

if(s.length()>5)return 0;

for(int i=0;i<s.length();i++)

if(s[i]<'0'||s[i]>'9')return 0;

return 1;

}

string go(){//递归函数,输入操作符,用递归进一步输入参数

string sx;

cin>>sx;//cout<<endl<<sx<<":\t";

//copy N X L:取出第N个字符串第X个字符开始的长度为L的字符串。

if(sx=="copy"){//返回字符串

int n=tod(go()),x=tod(go()),l=tod(go());//这些变量定义为局部变量,否则有故障,没进一步探测

return s[n].substr(x,l); }

//add S1 S2:判断S1,S2是否为0-99999之间的整数,若是则将其转化为整数做加法,若不是,则作字符串加法,返回的值为一字符串。

else if(sx=="add"){//返回字符串

string s1=go(),s2=go();

if(ok(s1)&&ok(s2))return tos(tod(s1)+tod(s2));

else return s1+s2;}

//find S N:在第N个字符串中从左开始找寻S字符串,返回其第一次出现的位置,若没有找到,返回字符串的长度。

else if(sx=="find"){

string s1=go();int n=tod(go());

if(s[n].find(s1)= =string::npos)return tos(s1.length());//没找到,返回长度

else return tos(s[n].find(s1));}//找到就返回位置

//rfind S N:在第N个字符串中从右开始找寻S字符串,返回其第一次出现的位置,若没有找到,返回字符串的长度。

else if(sx=="rfind"){

string s1=go();int n=tod(go());

if(s[n].rfind(s1)= =string::npos) return tos(s1.length());

else return tos(s[n].rfind(s1));}

//insert S N X:在第N个字符串的第X个字符位置中插入S字符串。

else if(sx=="insert"){

string s1=go();int n=tod(go()),x=tod(go());

s[n].insert(x,s1);//插入操作

}

//reset S N:将第N个字符串变为S。

else if(sx=="reset"){

string s1=go();int n=tod(go());

s[n]=s1;}

//print N:打印输出第N个字符串。

else if(sx=="print"){

cout<<s[tod(go())]<<endl;

return "";}//string go()该子程序是函数,要求返回字符串

//printall:打印输出所有字符串。

else if(sx=="printall"){

for(int i=1;i<=m;i++)cout<<s[i]<<endl;

}

else return sx;

return "";//如果某分支没有返回,这里统一return。函数不返回是规则错误

}

int main(){

//freopen("data.cpp","r",stdin);

cin>>m;

for(int i=1;i<=m;i++)cin>>s[i];

while(go()!="over");

return 0;

}

小结

  1. 线索多,有些头大,还是要有耐心、信心。
  2. 运行函数,是操作符就分支,再递归输入相应的参数。
  3. 整体上要返回字符串。如add、copy、find、rfind
  4. reset、insert、print、printall不用返回,但是该函数需要返回。
  5. 不是以上操作就返回参数
  6. 递归函数不能全局变量,最好各分支独立设立局部变量。
相关推荐
旧物有情1 小时前
蓝桥杯历届真题 #食堂(C++,Java)
java·c++·蓝桥杯
lzb_kkk3 小时前
【C++】C++11异步操作
c语言·开发语言·c++·1024程序员节
weixin_399264294 小时前
QT c++ 样式 设置 按钮(QPushButton)的渐变色美化
开发语言·c++·qt
不玩return的马可乐7 小时前
LeetCode 747. 至少是其他数字两倍的最大数
数据结构·c++·程序人生·算法·leetcode
ArmeriaLeap8 小时前
【题解】AT_abc388_e AtCoder Beginner Contest ABC388 E Simultaneous Kagamimochi
c++
怎么名字都重复8 小时前
1.两数之和--力扣
java·数据结构·算法·leetcode·软件工程
醋溜马桶圈9 小时前
【c++实战项目】负载均衡式在线OJ
开发语言·c++·负载均衡
是秋锋呀9 小时前
electron 上怎么用node 调用 c++ 提供的方法
javascript·c++·electron·webassembly
yonuyeung10 小时前
代码随想录算法【Day16】
数据结构·算法·leetcode