题目:
The count-and-say sequence is the sequence of integers with the first five terms as following:
1. 1
2. 11
3. 21
4. 1211
5. 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 where 1 ≤ n ≤ 30, generate the nth term of the count-and-say sequence. You can do so recursively, in other words from the previous member read off the digits, counting the number of digits in groups of the same digit.
Note: Each term of the sequence of integers will be represented as a string.
Example 1:
Input: 1
Output: "1"
Explanation: This is the base case.
Example 2:
Input: 4
Output: "1211"
Explanation: For n = 3 the term was "21" in which we have two groups "2" and "1", "2" can be read as "12" which means frequency = 1 and value = 2, the same way "1" is read as "11", so the answer is the concatenation of "12" and "11" which is "1211".
题目大意是:初始化 第一次:“1”
读第一次 第二次:“11” 意思是:1个1
读第二次 第三次:“21” 意思是:2个1
读第三次 第四次:“1211” 意思是:1个2,1个1
......
使用双指针分别指向相同元素的开始和结束的后一位:
class Solution {
public:
string countAndSay(int n) {
int k = n - 1;
string res = "1";
while(k)
{
string tmp = "";
int lo = 0;
int hi = lo + 1;
while(hi <= res.size())
{
while(hi < res.size() && res[lo] == res[hi])
{
hi++;
}
tmp += to_string(hi - lo);
tmp += res[lo];
lo = hi;
hi = hi + 1;
}
res = tmp;
k--;
}
return res;
}
};