Problem: 38. 外观数列
问题
思路
这个题首先想到的就是用递归,如然后就是对上一个的字符串进行遍历,遍历的同时进行判断,每次结束一个最小数量的组,就把这个小片段格式话成字符串,然后依次结束,把每个字符串拼接起来就是最终的结果,然后进入下一次的迭代;总体思路比较简单,但是代码效率非常低;
Code
char *res;//存储结果
int count,ch;
char str_temp[5000];//每次递归的上一次的字符串结果
void Backtril(int index, int n) {
char* temp = (char*)malloc(sizeof(char) * 200);//中间变量,用于存储几个几的情况
char* s = (char*)malloc(sizeof(char) * 5000);//组成本次迭代的结果
if(index>n)return;
s[0]='\0';
for(int i=0;i<strlen(str_temp);i++)//传入的是上次迭代的结果
{
if(str_temp[i]!=str_temp[i+1])//不用担心越界的情况,最后一个是‘1’,i+1对应‘\0'
{
switch (str_temp[i])//判断一下是哪个数
{
case '0':ch=0;break;
case '1':ch=1;break;
case '2':ch=2;break;
case '3':ch=3;break;
case '4':ch=4;break;
case '5':ch=5;break;
case '6':ch=6;break;
case '7':ch=7;break;
case '8':ch=8;break;
case '9':ch=9;break;
}
sprintf(temp,"%d",(count+1)*10+ch);//转换成字符串数字
strcat(s,temp);//拼接字符串
count=0;//情况计数器
}else
{
count++;//计数器计数
}
}
strcpy(res,s);//存储结果
strcpy(str_temp,s);//存储这次的结果,用于传入下次的迭代
Backtril(index + 1, n);//进入下次迭代
}
char* countAndSay(int n) {
res = (char*)malloc(sizeof(char) * 5000);
res[0]='1';//如果是n=1,则直接返回结果,这里初始值就是n=1的结果
res[1]='\0';
str_temp[0]='1';//初始开始的情况
str_temp[1]='\0';
count=0;
Backtril(2, n); //如果n是4的话,代表运行进行三次迭代就可以得出结果
//但是递归结束的条件是 if(index>n)return;所以2,3,4一共运行了三次迭代,第第四次5>4成立则回退;
return res;
}