题目:
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.
Note: Each term of the sequence of integers will be represented as a string.
Example 1:
Input: 1 Output: "1"
Example 2:
Input: 4 Output: "1211"
描述:
第一个数是1,对于 n > 1
第n个数的值是第n-1个数的读法
分析:
其实就是个递推,递推方式为
对第n个数,第n-1个数的读法是几个几,那么就写成几个几,比如
第二个数是11,读作2个1,则第三个数即为21...
模拟这个过程就行,比较不爽的的是无法使用全局变量,否则可以把这些结果保存下来,一劳永逸的解决问题,不用每次都执行一遍。
测试样例:
1
2
3
4
5
6
7
30
代码:
class Solution {
public:
string countAndSay(int n) {
string result = "1";
if (n == 1) {
return result;
}
for (int i = 1; i < n; ++ i) {
result = sayString(result);
}
return result;
}
string sayString(const string &target) {
int index = 0, len = target.size();
string result;
while (index < len) {
int temp = countItem(target, index);
result += to_string(temp) + target[index];
index += temp;
}
return result;
}
int countItem(const string &target, int index) {
char temp = target[index];
int result = 1;
for (int i = index + 1; target[i] == temp; ++ i) {
++ result;
}
return result;
}
};