单点时限: 2.0 sec
内存限制: 512 MB
问题描述
输入一个只含有小写字母和数字的字符串,将其中的数字用数字前面的字母序列进行替换,字母序列连续出现次数等于该数字。
输入格式
输入一个只含数字和小写字母的字符串 s(2≤|s|≤10 000)。
输入保证数字前面必有字母。连续数字个数不超过 3 个,没有前导零,不会都是零。
输出格式
输出替换后的字符串
样例:
input:
a2bc3d1
output:
aabcbcbcd
问题分析:
这道题我第一想法是滑动窗口来做,定义两个光标low和high。
遇到的问题是类似a1b1c的例子没有考虑到,当字母后面没有数字时默认为1。
同时打印的时候要注意两端的范围。
考察点:关于字符串的处理
代码解决部分:
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
typedef long long int lli;
typedef struct
{
}data;
void print(int low,int high,char* s,lli cnt)
{
for(lli i=0;i<cnt;i++)
{
for(int j=low;j<high;j++) printf("%c",s[j]);
}
}
int main()
{
char* s=(char *)malloc(sizeof(char)*10001);
scanf("%s",s);
int low=0,high=0;
for(high=0;high<strlen(s);high++)
{
// printf("pass");
if((s[high]>='0')&&(s[high]<='9'))
{
lli cnt=0;
int h=high;
// printf("!!%d!!\n",s[high]-'0');
while(s[high]>='0'&&s[high]<='9')
{
cnt=cnt*10+s[high]-'0';
high++;
}
high--;
print(low,h,s,cnt);
// printf("\n");
low=high+1;
}
else
{
continue;
}
}
if((s[strlen(s)-1]>'9')||(s[strlen(s)-1]<'0'))
{
print(low,strlen(s),s,1);
}
free(s);
return 0;
}