报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:
-
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”
拿到这道题时笔者觉得要读懂这道题还是不容易的,其实他有三种情况“1”—》“11”,“21“—》”1211“,”11“—》”21“,你只要见到这三部分去对应的翻译就行
实际意义:给出一个初始字符串"1",根据以下规则生成字符串。如果一个字符s[i]与s[i-1]和s[i+1]不同,那么就生成"1"+s[i]的字符串;如果连续n个字符都相同,那么就生成"n"+s[i]的字符串。例如字符串"1"会生成"11",而"11"会生成"21",“21"又会生成"1211”,以此类推。(ps:笔者在写这道题时遇到了很大的困难是在阅读网上大佬的文章后才搞懂题的意思)代码如下
#define maxn 10005
char s[maxn], t[maxn];
char* countAndSay(int n) {
strcpy(s, "1");
strcpy(t, "");
int cnt = 1;
char tmp[3];
for(int i = 2;i <= n;i++){
int len = strlen(s);
for(int j = 0;j < len;j++){
if(s[j] == s[j + 1]){
cnt++;
}else {
tmp[0] = cnt + '0';
tmp[1] = s[j];
tmp[2] = '\0';
strcat(t, tmp);
cnt = 1;
}
}
strcpy(s, t);
strcpy(t, "");
}
return s;
}