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

464

被折叠的 条评论
为什么被折叠?



