Count and Say
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.
Thoughts:
Scan the string while maintaining a "state" that counts the numbers. Save previous results for accelerating the next string generation.
Solution:
- class Solution {
- public:
- // save previous history for accelerated calculation
- vector<string> history;
- Solution()
- {
- history.emplace_back(string("1"));
- }
- string generate_seq(const string& in)
- {
- string generated;
- char scratch[64];
- char current = in[0];
- int count = 0;
- auto commit = [&]()
- {
- sprintf(scratch, "%d%c", count, current);
- generated += scratch;
- };
- for(auto ch : in)
- if (ch != current)
- {
- // we met another character
- commit();
- count = 1;
- current = ch;
- }
- else
- ++count;
- commit(); // commit the last continuous char accumulation
- return generated;
- }
- string countAndSay(int n)
- {
- while(n-1 >= history.size())
- // exploit the r-value reference
- history.emplace_back(generate_seq(history.back()));
- return history[n-1];
- }
- };
No comments:
Post a Comment