Easy!html
题目描述:算法
报数序列是指一个整数序列,按照其中的整数的顺序进行报数,获得下一个数。其前五项以下:spa
1. 1 2. 11 3. 21 4. 1211 5. 111221
1
被读做 "one 1"
("一个一"
) , 即 11
。11
被读做 "two 1s"
("两个一"
), 即 21
。21
被读做 "one 2"
, "one 1"
("一个二"
, "一个一"
) , 即 1211
。code
给定一个正整数 n ,输出报数序列的第 n 项。htm
注意:整数顺序将表示为一个字符串。blog
示例 1:字符串
输入: 1 输出: "1"
示例 2:get
输入: 4 输出: "1211"
解题思路:string
题目描述的不是很清楚,其实就是第i+1个字符串是第i个字符串的读法,第一字符串为 “1”io
好比第四个字符串是1211,它的读法是 1个一、1个2,2个1,所以第五个字符串是111221。
第五个字符串的读法是:3个一、2个二、1个1,所以第六个字符串是312211
......
简单的模拟就能够。
这道计数和读法问题仍是第一次遇到,看似挺复杂,其实仔细一看,算法很简单,就是对于前一个数,找出相同元素的个数,把个数和该元素存到新的string里。
C++解法一:
1 class Solution { 2 public: 3 string countAndSay(int n) { 4 if (n <= 0) return ""; 5 string res = "1"; 6 while (--n) { 7 string cur = ""; 8 for (int i = 0; i < res.size(); ++i) { 9 int cnt = 1; 10 while (i + 1 < res.size() && res[i] == res[i + 1]) { 11 ++cnt; 12 ++i; 13 } 14 cur += to_string(cnt) + res[i]; 15 } 16 res = cur; 17 } 18 return res; 19 } 20 };
其实咱们能够发现字符串中永远只会出现1,2,3这三个字符,假设第k个字符串中出现了4,那么第k-1个字符串一定有四个相同的字符连续出现,假设这个字符为1,则第k-1个字符串为x1111y。第k-1个字符串是第k-2个字符串的读法,即第k-2个字符串能够读为“x个1,1个1,1个y” 或者“*个x,1个1,1个1,y个*”,这两种读法分别能够合并成“x+1个1,1个y” 和 “*个x,2个1,y个*”,表明的字符串分别是“(x+1)11y” 和 "x21y",即k-1个字符串为“(x+1)11y” 或 "x21y",不可能为“x1111y”.
好比将前12个数字打印一下,发现一个颇有意思的现象,无论打印到后面多少位,出现的数字只是由1,2和3组成,网上也有人发现了并分析了缘由 (http://www.cnblogs.com/TenosDoIt/p/3776356.html),前12个数字以下:
1 1 1 2 1 1 1 1 2 2 1 1 2 2 1 1 3 1 1 2 2 2 1 1 1 3 2 1 3 2 1 1 1 1 3 1 2 1 1 1 3 1 2 2 1 3 2 1 1 3 1 1 1 2 3 1 1 3 1 1 2 2 1 1 1 1 3 1 2 2 1 1 3 3 1 1 2 1 3 2 1 1 3 2 1 2 2 2 1 1 1 3 1 1 2 2 2 1 2 3 2 1 1 2 1 1 1 3 1 2 2 1 1 3 1 2 1 1 3 2 1 1