#include <iostream>#include <stdio.h>#include <vector>#include <sstream>using namespace std;/*问题: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.分析:此题本质就是按照顺序数出每个数的出现次数,然后翻译层字符串。1211:One 1, One 2, Two 1,得到 111221111221:Three 1,Two 2,One 1, 31,22,11得到: 312211312211:One 3,Two 2,Two 1 13,22,21得到132221总结规律:将字符串分成多个部分,每一部分的值相同,数出每一部分对应元素个数num,组成对应值val新的子串: num val例如有11个2,那么变成112132221:11133211输入:123456数出:111211211111221312211关键:1总结规律:将字符串分成多个部分,每一部分的值相同,数出每一部分对应元素个数num,组成对应值val新的子串: num val2 for(int i = 1 ; i < len ; i++) { //找到相同元素 if(str.at(i) == value) { count++; } else { Result result(count , value); results.push_back(result); value = str.at(i); count = 1;//计数器变成1,当前数出现1次 } } //最后一个元素还没有统计,因为之前只是存放上一次的结果 Result result(count , value); results.push_back(result);*/typedef struct Result{ Result(int times , char value):_times(times), _value(value){} int _times; char _value;}Result;class Solution {public: string getNum(string str) { if(str.empty()) { return ""; } int len = str.length(); //开始进行数 char value = str.at(0); int count = 1; vector<Result> results; for(int i = 1 ; i < len ; i++) { //找到相同元素 if(str.at(i) == value) { count++; } else { Result result(count , value); results.push_back(result); value = str.at(i); count = 1;//计数器变成1,当前数出现1次 } } //最后一个元素还没有统计,因为之前只是存放上一次的结果 Result result(count , value); results.push_back(result); //拼接结果 int size = results.size(); stringstream resultStream; for(int i = 0 ; i < size ; i++) { resultStream << results.at(i)._times << results.at(i)._value; } string realResult = resultStream.str(); return realResult; } //注意这里的n为第几个,初始元素为1 string countAndSay(int n) { if(n <= 0) { return ""; } //需要将整数转换成字符串 string num("1"); if(1 == n) { return num; } string result; for(int i = 2 ; i <= n ; i++) { result = getNum(num); num = result; } return result; }};void process(){ int n; while(cin >> n) { Solution solution; string result = solution.countAndSay(n); cout << result << endl; }}int main(int argc , char* argv[]){ process(); getchar(); return 0;}
新闻热点
疑难解答