LeetCode:38. 報數(C++)
阿新 • • 發佈:2019-01-07
題目:
報數序列是指一個整數序列,按照其中的整數的順序進行報數,得到下一個數。其前五項如下:
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"
解答:
這題的關鍵是讀懂題意。如果把整個序列記為a[n],那麼a[n] = a[n - 1]中有幾個連續的數字 + 那個數字是什麼:
比如:
a[1] = 1;
a[2] = 11 //a[1]中有一個1;
a[3] = 21 //a[2]中有兩個1;
a[4] = 1211 //a[3]中有一個2,一個1;
a[5] = 111221 //a[4]中有一個1,一個2,兩個1;
由於a[n]只與a[n - 1]有關,程式碼中並不需要a[n]陣列。
class Solution { public: string countAndSay(int n) { string result = "1"; for (int i = 2; i <= n; i++) { result = countAndSay(result); } return result; } string countAndSay(string lastStr) { string str; int num = 1; for (int i = 1; i < lastStr.length(); i++) { if (lastStr[i - 1] != lastStr[i]) { str.append(to_string(num)); str.append(1, lastStr[i - 1]); num = 1; } else { num++; } } str.append(to_string(num)); str.append(1, lastStr[lastStr.length() - 1]); return str; } };