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. 递归函数不能全局变量,最好各分支独立设立局部变量。
相关推荐
white-persist4 分钟前
【内网运维】Netstat与Wireshark:内网运维溯源实战解析
运维·网络·数据结构·测试工具·算法·网络安全·wireshark
fqbqrr20 分钟前
2601,C++的模块1
c++
啊董dong22 分钟前
noi-2025年12月23号作业
数据结构·c++·算法·noi
青岛少儿编程-王老师25 分钟前
CCF编程能力等级认证GESP—C++8级—20251227
java·开发语言·c++
夏乌_Wx30 分钟前
练题100天——DAY35:棒球比赛+数组的度
数据结构
hd51cc32 分钟前
MFC打印技术
c++·mfc
youngee1138 分钟前
hot100-63买卖股票的最佳时机
数据结构·算法·leetcode
爱吃生蚝的于勒1 小时前
【Linux】零基础深入学习动静态库+深入学习地址
linux·运维·服务器·c语言·数据结构·c++·学习
_OP_CHEN1 小时前
【从零开始的Qt开发指南】(十四)Qt 窗口之“三剑客”:工具栏、状态栏、浮动窗口进阶实战指南
开发语言·c++·qt·前端开发·gui开发·qt窗口
郝学胜-神的一滴1 小时前
Qt重复添加控件问题探析:现象、原理与解决方案
开发语言·数据库·c++·qt·程序人生