题目链接:1084. 外观数列 (20)
题意:d, d1, d111, d113, d11231, d112213111, ...后面那个是对前面那个数的介绍。即统计相连且相同字符出现的次数,给定d和N,输出这个数列的第N个字符串。
思路:初始化字符串str为'd',递推得到第N个字符串。逐个判断字符串中相连且相同的字符的个数,然后将字符'd'和个数加入新建字符串jg中,直到所有字符遍历完,更新字符串str,直到得到迭代N-1次。题目关键是如何将个数转为字符串,我记得有sprintf(cc,"%d",d)和itoa(cc,d,10);但是用sprintf最后一个测试点会超时,itoa函数会编译错误。进一步发现个数不会超过10。所以可以直接将个数加‘0’就行了。
注意点:迭代次数,将jg复制到str时,不用清空str也是对的,因为随着迭代次数的增加字符串长度也会增加。
#include<stdio.h>
#include<string.h>
//#include<stdlib.h>
int main()
{
int N,i;
char d,str[1000000]={""};
scanf("%c %d",&d,&N);
str[0]=d;
for(i=0;i<N-1;i++){
int ip=0,j=0,m=0;
char jg[1000000]={""};
int nn=strlen(str);
while(j<nn){
while(str[j]==str[ip]&&j<nn)j++;
jg[m]=str[ip];
//char cc[10]={""};
//sprintf(cc,"%d",j-ip);
//itoa(cc,j-p,10);
//strcat(jg,cc);
jg[++m]=j-ip+'0';
m++;
//m=strlen(jg);
ip=j;
}
strcpy(str,"");
strcpy(str,jg);
}
printf("%s",str);
return 0;
}