38-Count And Say

類別:string

題目描述

這裏寫圖片描述

算法分析

1:“1”(有1個1)
2:“11”(表示上一個即第一個有1個1,而當前有2個1)
3:“21”(表示上一個即第二個有2個1,而當前有1個2,1個1)
3:“1211”(表示上一個即第三個有1個2和1個1,而當前有1個1,1個2,2個1)
4:“111221”……
給定數字n,需要從第一個數推到n,初始化strs[1] = “1”,然後用一個循環計算之後的每一個序號對應的字符串,對於每一個序號對應的字符串,需要用其前面一個字符串進行計算,遍歷字符串,並且計算每一個數字出現的次數然後轉換爲字符串即可。

代碼實現

#include <iostream>
#include <string>
#include <vector>
using namespace std;

string countAndSay(int n) {
    vector<string> readStr;
    readStr.push_back("1");
    string str = "", generateStr = "";
    int n1 = 0, count = 0;
    char pre = ' ';

    for (int i = 1; i < n; ++i) {
        generateStr = "";
        str = readStr[i - 1];
        n1 = str.length();
        count = 1;
        pre = str[0];

        for (int j = 1; j < n1; ++j) {
            //  count the continous same char
            if (str[j] == pre) {
                count++;
            } else {
                //  add chars
                generateStr += count + '0';
                generateStr += pre;
                count = 1;
                pre = str[j];
            }
        }
        // add last chars
        generateStr += count + '0';
        generateStr += pre;
        readStr.push_back(generateStr);
    }

    return readStr[n - 1];
}

int main() {
    int n;
    cin >> n;
    cout << countAndSay(n) << endl;
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章