leetcode38. 报数 🌟
题目:
报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:
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"
来源:力扣(LeetCode)
解答:
leetcode优秀方案(来自力扣答案统计页,没有明确作者是谁,可留言告知):
class Solution: def countAndSay(self, n: int) -> str: if n == 1: return '1' # 递归出口 s = self.countAndSay(n-1) res, count = '', 0 for i in range(len(s)): count += 1 if i == len(s) - 1 or s[i] != s[i+1]: # 最后一个字符串要提前终止 res += str(count) res += s[i] count = 0 return res
class Solution: def countAndSay(self, n: int) -> str: def recursion(s, n): if n == 1: return s else: key = s[0] s_next = "" count = 0 for i in range(len(s)): if s[i] == key: count += 1 else: s_next += str(count) + key count = 1 key = s[i] return recursion(s_next + str(count) + key, n - 1) return recursion('1', n)
class Solution: def countAndSay(self, n: int) -> str: result = '1' for loop in range(n-1): i = 0 temp = '' while i < len(result): cur_count = 1 while i<len(result)-1 and result[i]==result[i+1]: cur_count += 1 i += 1 temp = temp + str(cur_count) + result[i] i += 1 result = temp return result
class Solution: def countAndSay(self, n: int) -> str: def worker(n): n = str(n) i = 0 j = k = 1 temp = [] while i <= len(n) - 1 and j <= len(n): if j == len(n): temp.append((str(k), n[-1])) return ''.join([j for i in temp for j in i]) if n[i] == n[j]: j += 1 k += 1 else: temp.append((str(k), n[i])) i = j j = i + 1 k = 1 return ''.join([j for i in temp for j in i]) _cache = {1: '1'} for i in range(1, n + 1): if i not in _cache: _cache[i] = worker(_cache[i - 1]) return _cache[n]
class Solution: def countAndSay(self, n: int) -> str: if n==1: return "1" else: import re str1="" pattern=re.compile(r'(\d)\1{0,}') for i in pattern.finditer(self.countAndSay(n-1)): str1 += str(len(i.group(0))) + i.group(0)[0] return str1 # https://leetcode-cn.com/problems/count-and-say/comments/2777
class Solution: def countAndSay(self, n): import re s = '1' for _ in range(n - 1): s = ''.join(str(len(p[0])) + p[1] for p in re.findall(r'((.)\2*)', s)) return s # https://leetcode-cn.com/problems/count-and-say/comments/2915