大一好快就过完了,学了数据结构,留下点东西吧!
【问题描述】
从键盘输入包含扩展符'-'的字符串,将其扩展为等价的完整字符,例如将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);//输出
}