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. 递归函数不能全局变量,最好各分支独立设立局部变量。
相关推荐
一律清风16 分钟前
【Opencv】canny边缘检测提取中心坐标
c++·opencv
a东方青4 小时前
蓝桥杯 2024 C++国 B最小字符串
c++·职场和发展·蓝桥杯
XiaoyaoCarter6 小时前
每日一道leetcode
c++·算法·leetcode·职场和发展·二分查找·深度优先·前缀树
galaxy_strive6 小时前
qtc++ qdebug日志生成
开发语言·c++·qt
Hygge-star6 小时前
【数据结构】二分查找5.12
java·数据结构·程序人生·算法·学习方法
Darkwanderor6 小时前
c++STL-list的模拟实现
c++·list
Humbunklung7 小时前
Visual Studio 2022 中添加“高级保存选项”及解决编码问题
前端·c++·webview·visual studio
小乌龟不会飞7 小时前
gflags 安装及使用
c++·mfc·gflags 库
June`7 小时前
专题二:二叉树的深度搜索(二叉树剪枝)
c++·算法·深度优先·剪枝
加什么瓦8 小时前
Redis——底层数据结构
数据结构