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