【力扣】38. 外观数列 - 力扣(LeetCode)

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;
}
  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值