The count-and-say sequence is the sequence of integers with the first five terms as following:
1. 1 2. 11 3. 21 4. 1211 5. 111221
1
is read off as "one 1"
or 11
.11
is read off as "two 1s"
or 21
.21
is read off as "one 2
, then one 1"
or 1211
.
Given an integer n, generate the nth term of the count-and-say sequence.
Note: Each term of the sequence of integers will be represented as a string.
Example 1:
Input: 1 Output: "1"
Example 2:
Input: 4 Output: "1211"
Input Constraints:
1 <= n <= 30
对于前一个数,每一段相同元素的子数列数出相同元素的个数,然后这个子数组变为个数+数字,重复到结束。
解法: 迭代Iteration
Java:
public String countAndSay(int n) { if (n <= 0) return null; String result = "1"; int i = 1; while (i < n) { StringBuilder sb = new StringBuilder(); int count = 1; for (int j = 1; j < result.length(); j++) { if (result.charAt(j) == result.charAt(j - 1)) { count++; } else { sb.append(count); sb.append(result.charAt(j - 1)); count = 1; } } sb.append(count); sb.append(result.charAt(result.length() - 1)); result = sb.toString(); i++; } return result; }
Java:
public class Solution { public String countAndSay(int n) { StringBuilder curr=new StringBuilder("1"); StringBuilder prev; int count; char say; for (int i=1;i<n;i++){ prev=curr; curr=new StringBuilder(); count=1; say=prev.charAt(0); for (int j=1,len=prev.length();j<len;j++){ if (prev.charAt(j)!=say){ curr.append(count).append(say); count=1; say=prev.charAt(j); } else count++; } curr.append(count).append(say); } return curr.toString(); } }
Python:
class Solution: # @return a string def countAndSay(self, n): seq = "1" for i in xrange(n - 1): seq = self.getNext(seq) return seq def getNext(self, seq): i, next_seq = 0, "" while i < len(seq): cnt = 1 while i < len(seq) - 1 and seq[i] == seq[i + 1]: cnt += 1 i += 1 next_seq += str(cnt) + seq[i] i += 1 return next_seq
Python: wo
class Solution(object): def countAndSay(self, n): """ :type n: int :rtype: str """ s = '1' i = 1 while i < n: count = 1 curr = s[0] news = '' for j in xrange(1, len(s)): if curr == s[j]: count += 1 else: news += str(count) + s[j-1] curr = s[j] count = 1 news += str(count) + s[-1] s = news i += 1 return s
C++:
class Solution { public: string countAndSay(int n) { if (n <= 0) return ""; string res = "1"; while (--n) { string cur = ""; for (int i = 0; i < res.size(); ++i) { int cnt = 1; while (i + 1 < res.size() && res[i] == res[i + 1]) { ++cnt; ++i; } cur += to_string(cnt) + res[i]; } res = cur; } return res; } };