题目描述
「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。前五项如下:
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 = 3 时,序列是 "21",其中我们有 "2" 和 "1" 两组,"2" 可以读作 "12",也就是出现频次 = 1 而 值 = 2;类似 "1" 可以读作 "11"。所以答案是 "12" 和 "11" 组合在一起,也就是 "1211"。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/count-and-say
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
白话题目:
你确定你看的是颜值,不是身材?凹,错了,人家说的是外观,身材算吧,就这样吧。
意思是说每一个数字行都告诉我们这个规律中前一行的数字是什么样子的。
第一行是1
第二行开始说第一行有1个1----11
第三行说第二行有2个1----21
第四行说第三行有1个2,1个1,---1211
第五行说第四行有1个1,1个2,2个1。
算法:
这题哪里简单,哪里easy,哪里啦啦啦啦啦。
男:对 你无情 你残酷 你无理取闹
女:那你就不无情!?不残酷!?不无理取闹!?
男:我哪里无情!?哪里残酷!?哪里无理取闹!?
女:你哪里不无情!?哪里不残酷!?哪里不无理取闹!?
男:我就算在怎么无情 再怎么残酷 再怎么无理取闹也不会比你更无情 更残酷 更无理取闹 。
女:我会比你无情!?比你残酷!?比你无理取闹!?你才是我见过最无情 最残酷 最无理取闹的人 。
男:哼 我绝对没你无情 没你残酷 没你无理取闹 。
女:好 既然你说我无情 我残酷 我无理取闹我就无情给你看 残酷给你看 无理取闹给你看 。
男:看吧 还说你不无情 不残酷 不无理取闹现在完全展现你无情 残酷 无理取闹的一面了吧。
输入输出还算可以。
每一行都要计算已经存好的前一行的状态;想通了也就释然了。
每一行都当成一个字符串,我们人是怎么查数的,先看看这个字符吧,它后面的和它一样不,一样的话就往后查,指导不一样,你说了几个就记录到count中,【】【】【】【】【】,但是最后一个一个你要记录好,因为要记录他是啥。之后再找下一个字符是否有相同的字符挨着,循环往复,周而复始。最后就成功了。
下面要做的就是看代码如何输入、输出、处理存储中间字符数组啦。
“下面”竟然还有这么多的意思,需要开车否?购票上车了。
详细解释关注 B站 【C语言全代码】学渣带你刷Leetcode 不走丢 https://www.bilibili.com/video/BV1C7411y7gB
C语言完全代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char * countAndSay(int n)
{
int i;
char *re=calloc(5000,sizeof(char));//注意空间要足够大
char *s=calloc(5000,sizeof(char));
//malloc函数:不能初始化所分配的内存空间,在动态分配完内存后,里边数据是随机的垃圾数据。
//calloc函数:能初始化所分配的内存空间,在动态分配完内存后,自动初始化该内存空间为零。
s[0]='1';
s[1]='\0';//初始化
int k=0,cnt=0;//cnt指的是有几个相同的数;k代表re的下标
int p=2;
while(p<=n)
{
cnt=1;
k=0;//k的值初始化
for(i=0; i<strlen(s); i++)
{
cnt=1;
while(i<strlen(s)-1&&s[i]==s[i+1]) //计数,相等,且s[i]这个元素不是最后一个元素 ,要不就越界了啊
{
cnt++;//相同元素数+1
i++; //i往后走,
}
re[k]=cnt+'0';//表示数量,转字符,记得之前37题的吗?
k++; //写字符
re[k]=s[i];//多个相同元素的最后一个元素;无相同元素时,re[k]就是该元素
k++;
}
re[k]='\0';//re代表的是每次处理之后的结果,也是下一次循环要处理的字符串
strcpy(s,re);//注意一定不要用等号!!一定不要用等号!!一定不要用等号!!重要的事情说三遍
p++;
}
return s;
}
int main()
{
int n;
scanf("%d",&n);
char *result=countAndSay(n);
printf("%s\n",result);
return 0;
}