【Leetcode】 38. 报数

本文解析LeetCode上的报数序列问题,提供了一个C语言的解决方案,详细介绍了如何通过计数并报告前一个数中连续出现的数字来生成序列的下一个数。代码实现了从1开始到指定正整数n的报数序列。

题目链接:https://leetcode-cn.com/problems/count-and-say/description/

报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:

1.     1
2.     11
3.     21
4.     1211
5.     111221

1 被读作  "one 1"  ("一个一") , 即 11
11 被读作 "two 1s" ("两个一"), 即 21
21 被读作 "one 2",  "one 1" ("一个二" ,  "一个一") , 即 1211

给定一个正整数 n(1 ≤ n ≤ 30),输出报数序列的第 n 项。

注意:整数顺序将表示为一个字符串。

 

示例 1:

输入: 1
输出: "1"

示例 2:

输入: 4
输出: "1211"

 

 

这道题没有什么技巧,就是第n个数报的是第n-1个数有count个数字相连,报数规则可以看题目正文。值得注意的是ans数组的初始化需要在countAndSay函数的开头,而不能在定义全局变量的时候就初始化,不然会出现错误答案。通过测试发现,后台数据是多组案例循环调用函数,所以必须在每次调用函数的时候初始化。当然,如果换成JAVA或者C++来写,返回值是string类型,那就会轻松很多了,只不过博主强迫症用C惯了。。

PS:字符数组开10000肯定够了,因为数据最大n=30,答案输出长度是4462。

 

代码如下:

char ans[10000];
char* countAndSay(int n){
    char temp[10000];
    ans[0]='1',ans[1]='\0';
    for(int i=2; i<=n; i++){
        int len=strlen(ans);
        int count=0;
        for(int j=0,k=0; j<len; j++){
            if(j&&ans[j]!=ans[j-1]){
                temp[k++]=count+'0';
                temp[k++]=ans[j-1];
                count=1;
            }
            else{
                count++;
            }
            if(j==len-1){
                temp[k++]=count+'0';
                temp[k++]=ans[j];
                temp[k]='\0';
            }
        }
        strcpy(ans,temp);
    }
    return ans;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值