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. 递归函数不能全局变量,最好各分支独立设立局部变量。
相关推荐
云边有个稻草人13 分钟前
【C++】第八节—string类(上)——详解+代码示例
开发语言·c++·迭代器·string类·语法糖auto和范围for·string类的常用接口·operator[]
惊鸿一博35 分钟前
c++ &&(通用引用)和&(左值引用)区别
开发语言·c++
爱喝热水的呀哈喽35 分钟前
Java 集合 Map Stream流
数据结构
Dovis(誓平步青云)1 小时前
【数据结构】排序算法(中篇)·处理大数据的精妙
c语言·数据结构·算法·排序算法·学习方法
nuo5342021 小时前
黑马 C++ 学习笔记
c语言·c++·笔记·学习
Touper.1 小时前
L2-003 月饼
数据结构·算法·排序算法
DARLING Zero two♡1 小时前
C++类间的 “接力棒“ 传递:继承(上)
开发语言·c++·继承·里氏替换原则
会讲英语的码农2 小时前
如何学习C++以及C++的宏观认知
开发语言·c++·学习
Merokes9 小时前
关于Gstreamer+MPP硬件加速推流问题:视频输入video0被占用
c++·音视频·rk3588
请来次降维打击!!!10 小时前
优选算法系列(5.位运算)
java·前端·c++·算法