{ "question_id": 38, "question_title": "外观数列", "difficulty": "中等", "question_content": "
\n

给定一个正整数 n ,输出外观数列的第 n 项。

\n\n

「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。

\n\n

你可以将其视作是由递归公式定义的数字字符串序列:

\n\n \n\n

前五项如下:

\n\n
\n    1.     1\n    2.     11\n    3.     21\n    4.     1211\n    5.     111221\n    第一项是数字 1 \n    描述前一项,这个数是 1 即 “ 一 个 1 ”,记作 \"11\"\n    描述前一项,这个数是 11 即 “ 二 个 1 ” ,记作 \"21\"\n    描述前一项,这个数是 21 即 “ 一 个 2 + 一 个 1 ” ,记作 \"1211\"\n    描述前一项,这个数是 1211 即 “ 一 个 1 + 一 个 2 + 二 个 1 ” ,记作 \"111221\"\n    
\n\n

描述 一个数字字符串,首先要将字符串分割为 最小 数量的组,每个组都由连续的最多 相同字符\n 组成。然后对于每个组,先描述字符的数量,然后描述字符,形成一个描述组。要将描述转换为数字字符串,先将每组中的字符数量用数字替换,再将所有描述组连接起来。

\n\n

例如,数字字符串 \"3322251\" 的描述如下图:

\n \"\"\n\n \n\n

 

\n\n

示例 1:

\n\n
输入:n = 1\n输出:\"1\"\n解释:这是一个基本样例。\n
\n\n

示例 2:

\n\n
输入:n = 4\n输出:\"1211\"\n解释:\ncountAndSay(1) = \"1\"\ncountAndSay(2) = 读 \"1\" = 一 个 1 = \"11\"\ncountAndSay(3) = 读 \"11\" = 二 个 1 = \"21\"\ncountAndSay(4) = 读 \"21\" = 一 个 2 + 一 个 1 = \"12\" + \"11\" = \"1211\"\n
\n\n

 

\n\n

提示:

\n\n \n
", "topic_link": "https://bbs.csdn.net/topics/600470795", "cpp": "#include \n#include \n#include \nstatic void parse(char *input, char *output)\n{\n\tchar *p = input;\n\tchar *q = output;\n\twhile (*p != '\\0')\n\t{\n\t\tint count = 1;\n\t\twhile (p[0] == p[1])\n\t\t{\n\t\t\tcount++;\n\t\t\tp++;\n\t\t}\n\t\tint n = 0;\n\t\twhile (count > 0)\n\t\t{\n\t\t\tn += count % 10;\n\t\t\tcount /= 10;\n\t\t}\n\t\twhile (n > 0)\n\t\t{\n\t\t\t*q++ = (n % 10) + '0';\n\t\t\tn /= 10;\n\t\t}\n\t\t*q++ = p[0];\n\t\tp++;\n\t}\n\t*q = '\\0';\n}\nstatic char *countAndSay(int n)\n{\n\tif (n < 1)\n\t{\n\t\treturn NULL;\n\t}\n\tchar *result;\n\tchar *prev = malloc(10000);\n\tchar *next = malloc(10000);\n\tstrcpy(prev, \"1\");\n\tif (n == 1)\n\t{\n\t\treturn prev;\n\t}\n\tint i;\n\tfor (i = 2; i <= n; i++)\n\t{\n\t\tif (i & 0x1)\n\t\t{\n\t\t\tparse(next, prev);\n\t\t\tresult = prev;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tparse(prev, next);\n\t\t\tresult = next;\n\t\t}\n\t}\n\treturn result;\n}\nint main(int argc, char **argv)\n{\n\tif (argc != 2)\n\t{\n\t\tfprintf(stderr, \"Usage: ./test n\\n\");\n\t\texit(-1);\n\t}\n\tprintf(\"%s\\n\", countAndSay(atoi(argv[1])));\n\treturn 0;\n}", "java": "class Solution {\n\tpublic String countAndSay(int n) {\n\t\tString pre = \"1\";\n\t\tfor (int i = 1; i < n; i++) {\n\t\t\tStringBuilder temp = new StringBuilder();\n\t\t\tchar c = pre.charAt(0);\n\t\t\tint cnt = 1;\n\t\t\tfor (int j = 1; j < pre.length(); j++) {\n\t\t\t\tchar cc = pre.charAt(j);\n\t\t\t\tif (c == cc) {\n\t\t\t\t\tcnt++;\n\t\t\t\t} else {\n\t\t\t\t\ttemp.append(cnt).append(c);\n\t\t\t\t\tcnt = 1;\n\t\t\t\t\tc = cc;\n\t\t\t\t}\n\t\t\t}\n\t\t\ttemp.append(cnt).append(c);\n\t\t\tpre = temp.toString();\n\t\t}\n\t\treturn pre;\n\t}\n}", "js": "", "python": "class Solution:\n\tdef countAndSay(self, n):\n\t\tif n == 1:\n\t\t\treturn '1'\n\t\tx = '1'\n\t\twhile n > 1:\n\t\t\tx = self.count(x)\n\t\t\tn -= 1\n\t\treturn x\n\tdef count(self, x):\n\t\tm = list(x)\n\t\tres = []\n\t\tm.append(None)\n\t\ti , j = 0 , 0\n\t\twhile i < len(m) - 1:\n\t\t\tj += 1\n\t\t\tif m[j] != m[i]:\n\t\t\t\tres += [j - i, m[i]]\n\t\t\t\ti = j\n\t\treturn ''.join(str(s) for s in res)\n# %%\ns = Solution()\nprint(s.countAndSay(n = 4))", "status": 1, "keywords": "字符串", "license": { "cpp": "https://github.com/begeekmyfriend/leetcode", "python": "https://github.com/qiyuangong/leetcode", "java": "https://blog.csdn.net/a1439775520/article/details/104314641" }, "notebook": { "cpp": "https://codechina.csdn.net/csdn/csdn-daily-code/-/jupyter/master/data/notebook/leetcode/ipynb/37/37_cpp.ipynb?type=file", "python": "https://codechina.csdn.net/csdn/csdn-daily-code/-/jupyter/master/data/notebook/leetcode/ipynb/37/37_python.ipynb?type=file", "java": "https://codechina.csdn.net/csdn/csdn-daily-code/-/jupyter/master/data/notebook/leetcode/ipynb/37/37_java.ipynb?type=file" }, "notebook_enable": 1 }