類別: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;
}