练习

字符串操作

题目描述

    初始一空串,给定以下操作(下述描述中,下标均从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,字符串始终不存在空白字符

输出

    具体输出见样例

样例输入

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

样例输出

aeiou
aeiouuoiea
aeouuoea
aeouuoea
8
ouuoea
ouzzzzzuoea
6

提示

AC代码

#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[])
{
	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])
{
	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[])
{
	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])
{
	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])
{
	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)
{
	int i;
	for(i=n-1;i<strlen(a);i++)
	{
		a[i]=a[i+m-n+1];
	}
	cout<<a<<"\n";
}

注意

删除那部分,如果少了i–,会出现abccdd→abcdd的情况即新进的那一位不会被检查到而保留下来。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值