LeetCode(38): 報數


Easy!

題目描述:

報數序列是指一個整數序列,按照其中的整數的順序進行報數,得到下一個數。其前五項如下:

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 ,輸出報數序列的第 n 項。

注意:整數順序將表示為一個字符串。

示例 1:

輸入: 1
輸出: "1"

示例 2:

輸入: 4
輸出: "1211"

解題思路:

題目描述的不是很清楚,其實就是第i+1個字符串是第i個字符串的讀法,第一字符串為 “1”

比如第四個字符串是1211,它的讀法是 1個1、1個2,2個1,因此第五個字符串是111221。

第五個字符串的讀法是:3個1、2個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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM