题意:
报数序列的第n项依靠第n-1项报数来取得。
如第二项的求解:
首先知道第一项:1。
对1报数: 1个1。
那么便知道第二项了:11。
思路:
1.不能一步登天,要一轮一轮地求到第n项。
2.知道报数可以分为这种情况:‘几’个’几’。
3.定义三个数组。
原数组 1,储存第一项和为下一项作模板。
新数组2 ,储存下一项和复制给原数组 。
暂时数组3,储存’几’个’几’和粘贴给新数组。
详细注释代码:
char* countAndSay(int n)
{
char *old = (char*)malloc(sizeof(char)*5000);strcpy(old, "1");//原数组
char *new = (char*)malloc(sizeof(char)*5000);strcpy(new, "");//新数组
char temp[3];//暂时数组
int count = 1;//用于记录相同的次数
int i;
int j;
for (i=1; i<n; i++)//第n项便要有n-1轮
{
for (j=0; j<strlen(old); j++)//每一轮跑strlen(old)次(遍历原数组),以其为模板报数。
{
if (old[j] == old[j+1])//如果遇到相同的字符便计数
{
count++;
}
else
{
temp[0] = count + '0';//int型转化成char型(加个‘0’或48,原理字符以ascii值的方式储存在内存中,且字符数字连续,(int)count + ‘0’ = count的字符的ascii值。
// 这是第一个'几';
count = 1;//恢复count默认
temp[1] = old[j];//这是第二个'几'
temp[2] = '\0';//手动结束该字符串
strcat(new,temp);//将暂时数组粘贴到新数组后。
}
}
strcpy(old,new);//每轮结束后。把新数组粘贴到原数组。
strcpy(new,"");//同时清空新数组,为下一项作准备。
}
return old;
}
希望能帮助到你,我将无比快乐。
你的点赞✌️,是我前进的动力。
题目补充:
报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:
-
1
-
11
-
21
-
1211
-
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”
补充完毕。