题目;
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是1个1,为“11";11是两个1,为”21“;21是一个2一个1,为”1211“。
方法一:迭代。两层循环,将拼接后的字符串作为下一次遍历的对象。
class Solution {
public:
string countAndSay(int n) {
if(n<1) return "";//特殊情况单独说明
string say="1";//起始
for(int i=1;i<n;i++)
{
int count = 0;
stringstream ss;
char last = say[0];
for(int j=0;j<say.length();j++)
{
if(say[j] == last) count++;
else
{
ss<<count<<last;
count = 1;
last = say[j];
}
}
ss << count << last;//字符串拼接
say = ss.str();
}
return say;
}
};
方法二:递归。这种前一个与后一个有联系的,使用递归的方法真的很好理解,只需要考虑一次的情况就可以。
class Solution {
public:
string countAndSay(int n) {
if(n<1) return "";
if(n==1) return "1";
string s=countAndSay(n-1);
int m = s.length();
char t=s[0];
int count=0;
stringstream ss;
for(int i=0;i<m;i++)
{
if(s[i]==t) count++;
else
{
ss<<count<<t;
t=s[i];
count=1;
}
}
ss<<count<<t;
return ss.str();
}
};