Description:
The count-and-say sequence is the sequence of integers beginning as follows:
1, 11, 21, 1211, 111221, …
1 is read off as “one 1” or 11.
11 is read off as “two 1s” or 21.
21 is read off as “one 2”, then “one 1” or 1211.
Given an integer n, generate the nth sequence.
Note: The sequence of integers will be represented as a string.
分析:
对连续出现的字符计数,即可
代码:
#include <iostream>
#include <sstream>
#include <vector>
#include <utility>
using namespace std;
string GetNextString(string str2)
{
//思路:计数相连的相同字符
string result = "";
int len = str2.size();
vector<pair<char,int>> counting; //记录每个字符(数字)出现的次数
int k = 1;
if(1 == len)
return result + "1"+ str2;
for (int i = 0; i < len-1; i++) {
if (str2[i] == str2[i+1])
k++;
else{
counting.push_back(pair<char,int>(str2[i],k));
k = 1;
}
if (k > 1) //最后两个字符相等
counting.push_back(pair<char,int>(str2[i],k));
if (str2[len-2] != str2[len-1]) //最后两个字符不相等
counting.push_back(pair<char,int>(str2[len-1],1));
}
for (auto it = counting.begin(); it != counting.end(); it++) {
//int 转换为 string
stringstream ss;
ss<<(*it).second;
string tempstring = ss.str();
result += tempstring;
result += (*it).first;
}
return result;
}
void CountAndSay(string str1, int num)
{
std::cout << str1 << std::endl;
for (int i = 1; i < num; i++) {
str1 = GetNextString(str1);
std::cout << str1 << std::endl;
}
}
int main(int argc, char const *argv[]) {
string str = "1";
int num = 5;
CountAndSay(str,num);
return 0;
}
测试: