问题描述:
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是“1”,因为1中有一个"1",所以2是"11",因为2中有两个1,所以3是"21",因为3中有一个2一个1,所以4是"1211"。
解题思路:
迭代计算式每一步的结果,没有啥特别的步骤。每次遇到与之前相同的数字,就跳过,计数器tmp++。
源码:
class Solution {
public:
string countAndSay(int n) {
string result = "1";
while(--n){
string cur = "";
for(int i=0; i<result.size(); i++){
int tmp = 1;
while(i+1<result.size() && result[i+1]==result[i]){
tmp++;
i++;
}
cur += to_string(tmp) + result[i];
// cout<<cur<<endl;
}
result = cur;
}
return result;
}
};