1. 程式人生 > 實用技巧 >Leetcode-38.外觀數列

Leetcode-38.外觀數列

38. 外觀數列

給定一個正整數 n ,輸出外觀數列的第 n 項。

「外觀數列」是一個整數序列,從數字 1 開始,序列中的每一項都是對前一項的描述。

你可以將其視作是由遞迴公式定義的數字字串序列:

  • countAndSay(1) = "1"
  • countAndSay(n) 是對 countAndSay(n-1) 的描述,然後轉換成另一個數字字串。

前五項如下:

1.     1
2.     11
3.     21
4.     1211
5.     111221
第一項是數字 1 
描述前一項,這個數是 1 即 “ 一 個 1 ”,記作 "11"
描述前一項,這個數是 11 即 “ 二 個 1 ” ,記作 "21"
描述前一項,這個數是 21 即 “ 一 個 2 + 一 個 1 ” ,記作 "1211"
描述前一項,這個數是 1211 即 “ 一 個 1 + 一 個 2 + 二 個 1 ” ,記作 "111221"

描述 一個數字字串,首先要將字串分割為 最小 數量的組,每個組都由連續的最多 相同字元 組成。然後對於每個組,先描述字元的數量,然後描述字元,形成一個描述組。要將描述轉換為數字字串,先將每組中的字元數量用數字替換,再將所有描述組連線起來。

  • 1 <= n <= 30

由於測試樣例很少,所以可以提前寫個程式都算出來,然後根據n返回,(面向測試用例程式設計~_~)

正常做法就是遞迴加迴圈遍歷。

class Solution {
public:
    string countAndSay(int n) {
        if (n == 1) return to_string(1);
        string pre_s = countAndSay(n - 1);
        string result = "";
        bool start = true;
        char current_char;
        int current_num = 0;
        for (char c : pre_s) {
            if (start == true) {
                current_char = c;
                current_num += 1;
                start = false;
            } else {
                if (c == current_char) {
                    current_num += 1;
                } else {
                    result = result + to_string(current_num) + current_char;
                    current_char = c;
                    current_num = 1;
                }
            }
        }
        result = result + to_string(current_num) + current_char;
        return result;
    }
};