题目描述
初始一空串,给定以下操作(下述描述中,下标均从1开始)
INSERT_STR index substr: 在下标为index的位置插入字符串substr,操作结束后输出字符串,保证操作合法
DELETE_CHAR character: 删除字符串中所有的character字符,操作结束后输出字符串
DELETE_RANGE left right: 删除下标为[left, right]的子串,操作结束后输出字符串,保证操作合法
INSERT_REVERSE_STR: 将字符串自身反转后的串接在自身后,操作结束后输出字符串
REVERSE_STR: 将字符串反转,操作结束后输出字符串
COUNT_VOWEL: 统计元音数量之和(即aeiou的数量之和,注意包含大小写),操作结束后输出统计值
输入
测试数据只有一组
每行输入一个操作
操作以 OVER 结束
输入数据保证不超过1000行,字符串的长度保证始终不超过10000,字符串始终不存在空白字符
输出
具体输出见样例
输入输出样例
输入样例1 <-复制
INSERT_STR 1 aeiou
INSERT_REVERSE_STR
DELETE_CHAR i
REVERSE_STR
COUNT_VOWEL
DELETE_RANGE 1 2
INSERT_STR 3 zzzzz
COUNT_VOWEL
OVER
输出样例1
aeiou
aeiouuoiea
aeouuoea
aeouuoea
8
ouuoea
ouzzzzzuoea
6
AC代码
c语言版
#include<stdio.h>
#include<string.h>
void charu(char a[1000], int n, char s[]);
void INSERT_REVERSE_STR(char a[1000]);
void DELETE_CHAR(char a[1000], char s[]);
void REVERSE_STR(char a[1000]);
void COUNT_VOWEL(char a[1000]);
void DELETE_RANGE(char a[1000], int n, int m);
int main()
{
int n, m;
char ch[1000], s[50];
ch[0] = '\0'; // 初始化字符串为空
while (scanf("%s", s) != EOF)
{
if (strcmp(s, "INSERT_STR") == 0)
{
scanf("%d%s", &n, s);
charu(ch, n, s);
}
else if (strcmp(s, "INSERT_REVERSE_STR") == 0)
INSERT_REVERSE_STR(ch);
else if (strcmp(s, "DELETE_CHAR") == 0)
{
scanf("%s", s);
DELETE_CHAR(ch, s);
}
else if (strcmp(s, "REVERSE_STR") == 0)
REVERSE_STR(ch);
else if (strcmp(s, "COUNT_VOWEL") == 0)
COUNT_VOWEL(ch);
else if (strcmp(s, "DELETE_RANGE") == 0)
{
scanf("%d%d", &n, &m);
DELETE_RANGE(ch, n, m);
}
else if (strcmp(s, "OVER") == 0)
break;
}
}
void charu(char a[1000], int n, char s[])
{
int i, j, k1, k2;
k1 = strlen(a);
k2 = strlen(s);
for (i = k1; i >= n - 1; i--)
{
a[i + k2] = a[i];
}
for (i = n - 1, j = 0; j < k2; i++, j++)
{
a[i] = s[j];
}
printf("%s\n", a);
}
void INSERT_REVERSE_STR(char a[1000])
{
int i, k1;
k1 = strlen(a);
for (i = k1; i < k1 * 2; i++)
{
a[i] = a[k1 * 2 - i - 1];
}
a[k1 * 2] = '\0';
printf("%s\n", a);
}
void DELETE_CHAR(char a[1000], char s[])
{
int i, j, flag, k1, k2;
k1 = strlen(a);
k2 = strlen(s);
for (i = 0; i < k1; i++)
{
flag = 0;
if (a[i] == s[0])
{
for (j = 2; j < k2; j++)
{
if (a[i + j] != s[j])
{
flag = 1;
break;
}
}
if (flag == 0)
{
for (j = i; j < k1; j++)
{
a[j] = a[j + k2];
}
}
k1--;
i--;
}
}
printf("%s\n", a);
}
void REVERSE_STR(char a[1000])
{
int i, k1;
char c[1000];
k1 = strlen(a);
for (i = 0; i < k1; i++)
{
c[i] = a[k1 - i - 1];
}
c[k1] = '\0';
strcpy(a, c);
printf("%s\n", a);
}
void COUNT_VOWEL(char a[1000])
{
int i, n;
n = 0;
for (i = 0; i < strlen(a); i++)
{
if (a[i] == 'a' || a[i] == 'e' || a[i] == 'i' || a[i] == 'o' || a[i] == 'u')
n++;
else if (a[i] == 'A' || a[i] == 'E' || a[i] == 'I' || a[i] == 'O' || a[i] == 'U')
n++;
}
printf("%d\n", n);
}
void DELETE_RANGE(char a[1000], int n, int m)
{
int i;
for (i = n - 1; i < strlen(a); i++)
{
a[i] = a[i + m - n + 1];
}
printf("%s\n", a);
}
c++版
#include<bits/stdc++.h>
using namespace std;
void charu(char a[1000],int n,char s[]);
void INSERT_REVERSE_STR(char a[1000]);
void DELETE_CHAR(char a[1000],char s[]);
void REVERSE_STR(char a[1000]);
void COUNT_VOWEL(char a[1000]);
void DELETE_RANGE(char a[1000],int n,int m);
int main()
{
int n,m;
char ch[1000],s[50];
ch[0]='\0';
while(cin>>s)
{
if(strcmp(s,"INSERT_STR")==0)
{
cin>>n>>s;
charu(ch,n,s);//
}
else if(strcmp(s,"INSERT_REVERSE_STR")==0)
INSERT_REVERSE_STR(ch);
else if(strcmp(s,"DELETE_CHAR")==0)
{
cin>>s;
DELETE_CHAR(ch,s);
}
else if(strcmp(s,"REVERSE_STR")==0)
REVERSE_STR(ch);
else if(strcmp(s,"COUNT_VOWEL")==0)
COUNT_VOWEL(ch);
else if(strcmp(s,"DELETE_RANGE")==0)
{
cin>>n>>m;
DELETE_RANGE(ch,n,m);
}
else if(strcmp(s,"OVER")==0)
break;
}
}
void charu(char a[1000],int n,char s[])
//INSERT_STR index substr: 在下标为index的位置插入字符串substr,操作结束后输出字符串,保证操作合法
{
int i,j,k1,k2;
k1=strlen(a);
k2=strlen(s);
for(i=k1;i>=n-1;i--)
{
a[i+k2]=a[i];
}
for(i=n-1,j=0;j<k2;i++,j++)
{
a[i]=s[j];
}
cout<<a<<"\n";
}
void INSERT_REVERSE_STR(char a[1000])
//INSERT_REVERSE_STR: 将字符串自身反转后的串接在自身后,操作结束后输出字符串
{
int i,k1;
k1=strlen(a);
for(i=k1;i<k1*2;i++)
{
a[i]=a[k1*2-i-1];
}
a[k1*2]='\0';
cout<<a<<"\n";
}
void DELETE_CHAR(char a[1000],char s[])
//DELETE_CHAR character: 删除字符串中所有的character字符,操作结束后输出字符串
{
int i,j,flag,k1,k2;
k1=strlen(a);
k2=strlen(s);
for(i=0;i<k1;i++)
{
flag=0;
if(a[i]==s[0])
{
for(j=2;j<k2;j++)
{
if(a[i+j]!=s[j])
{
flag=1;
break;
}
}
if(flag==0)
{
for(j=i;j<k1;j++)
{
a[j]=a[j+k2];
}
}
k1--;
i--;
}
}
cout<<a<<"\n";
}
void REVERSE_STR(char a[1000])
//REVERSE_STR: 将字符串反转,操作结束后输出字符串
{
int i,k1;
char c[1000];
k1=strlen(a);
for(i=0;i<k1;i++)
{
c[i]=a[k1-i-1];
}
c[k1]='\0';
strcpy(a,c);
cout<<a<<"\n";
}
void COUNT_VOWEL(char a[1000])
//COUNT_VOWEL: 统计元音数量之和(即aeiou的数量之和,注意包含大小写),操作结束后输出统计值
{
int i,n;
n=0;
for(i=0;i<strlen(a);i++)
{
if(a[i]=='a'||a[i]=='e'||a[i]=='i'||a[i]=='o'||a[i]=='u')
n++;
else if(a[i]=='A'||a[i]=='E'||a[i]=='I'||a[i]=='O'||a[i]=='U')
n++;
}
cout<<n<<"\n";
}
void DELETE_RANGE(char a[1000],int n,int m)
//DELETE_RANGE left right: 删除下标为[left, right]的子串,操作结束后输出字符串,保证操作合法
{
int i;
for(i=n-1;i<strlen(a);i++)
{
a[i]=a[i+m-n+1];
}
cout<<a<<"\n";
}
函数charu
实现在指定位置插入字符串,并输出结果。
函数INSERT_REVERSE_STR
实现将字符串自身反转后拼接在后面,并输出结果。
函数DELETE_CHAR
实现删除字符串中所有指定的字符,并输出结果。
函数REVERSE_STR
实现将字符串反转,并输出结果。
函数COUNT_VOWEL
实现统计字符串中元音字母的数量,并输出结果。
函数DELETE_RANGE
实现删除字符串中指定范围的子串,并输出结果。
在main
函数中,根据输入的操作类型调用相应的函数,并不断进行操作,直到输入OVER
结束。
(by 归忆)