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