BUAA大一下数据结构题解(扩展字符A)

大一好快就过完了,学了数据结构,留下点东西吧!

【问题描述】
从键盘输入包含扩展符'-'的字符串,将其扩展为等价的完整字符,例如将a-d扩展为abcd,并输出扩展后的字符串。

要求:只处理[a-z]、[A-Z]、[0-9]范围内的字符扩展,即只有当扩展符前后的字符同时是小写字母、大写字母或数字,并且扩展符后的字符大于扩展符前的字符时才进行扩展,其它情况不进行扩展,原样输出。例如:a-R、D-e、0-b、4-B等字符串都不进行扩展。


【输入形式】
从键盘输入包含扩展符的字符串
【输出形式】
输出扩展后的字符串

【输入样例1】
ADEa-g-m02
【输出样例1】
ADEabcdefghijklm02

【输入样例2】
cdeT-bcd
【输出样例2】
cdeT-bcd

【样例说明】
将样例1的输入ADEa-g-m02扩展为:ADEabcdefghijklm02;样例2的输入cdeT-bcd中,扩展符前的字符为大写字母,扩展符后的字符为小写字母,不在同一范围内,所以不进行扩展。

这道题比较基本,老师也说比较简单,所以放在第一个,运用简单的知识就可以做出来。

思路:在对输入的字符串进行遍历时,一旦找到‘-’,就要进行判断,如果需要拓展,就将要加入的字符串插入进去。

参考代码:

#include <stdio.h>
#include <string.h>
char ch[100000],map[100000];//定义两个数组一个用于存放原始数组并进行修改,一个用于保存操作。
void sert(int i,int k,int x,int j)
{
    int temp;
    for(k=1;k<=x;k++)
    {
        ch[i+k-1]=ch[i-1]+k;
    }//将字符进行拓展
    for(temp=0;temp<j;temp++)
    {
        ch[i+x+temp]=map[temp];
    }//将在map中储存的字符拷贝到ch中
}
int main()
{
    gets(ch);//读取
    int len,i=0,j=0,x,k,hold,temp;
    int w,e,r,t,y,u;//用于判断字符是在那、哪些区域内
    len=strlen(ch);//注意,这个len是要实时进行变化
    for(i=0;i<len;i++)
    {
        if(ch[i]=='-'&&ch[i+1]>ch[i-1])
        {
            x=ch[i+1]-ch[i-1]-1;//要拓展的字符个数
            hold=i;
            for(hold++,j=0;hold<len;hold++,j++)
               {
                 map[j]=ch[hold];
               }//将i+1到末尾的字符存储到map里
               w=ch[i-1]-'a';
               e=ch[i+1]-'a';
               r=ch[i-1]-'A';
               t=ch[i+1]-'A';
               y=ch[i-1]-'0';
               u=ch[i+1]-'0';//用于判断是否需要拓展的是哪种类型
            if(0<=w&&w<25&&0<e&&e<=25)//判断是否要拓展的为小写字母
                {
                    sert(i,k,x,j);//将字符拓展
                }
            else if(0<=r&&r<25&&0<t&&t<=25)//判断是否需要拓展的为大写字母
                {
                    sert(i,k,x,j);
                }
            else if(0<=y&&y<9&&0<u&&u<=9)//判断是否需要拓展的为数字
                {
                    sert(i,k,x,j);
                }
        len=strlen(ch);//更新len
        }
    }
    printf("%s",ch);//输出
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值