文|Seraph
01 | 问题
报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:
1、 1
2、 11
3、 21
4、 1211
5、 111221
1 被读作 "one 1" ("一个一") , 即 11。
11 被读作 "two 1s" ("两个一"), 即 21。
21 被读作 "one 2", "one 1" ("一个二" , "一个一") , 即 1211。
给定一个正整数 n(1 ≤ n ≤ 30),输出报数序列的第 n 项。
注意:整数顺序将表示为一个字符串。
示例 1:
输入: 1
输出: "1"
示例 2:
输入: 4
输出: "1211"
02 |解题
初解:
递归方法,可以看到没个数都是由前一个数推导过来的,终止条件为1,所以可以使用递归方法处理,如下:
class Solution {
public:
string countAndSay(int n) {
if(n==1)
return "1";
string str = countAndSay(n-1);
string result="";
int size = str.size();
int i=0;
int j=0;
int iCount=0;
while(j<size)
{
if(str[i]==str[j])
{
iCount++;
j++;
}
else
{
result += to_string(iCount);
result += str[i];
i=j;
iCount=0;
}
}
result += to_string(iCount);
result += str[i];
return result;
}
};
终解:
使用全局的动态string数组,可以减少已查询过的项重复推导计算。
vector<string> g_vcStr;
class Solution {
public:
string countAndSay(int n) {
if(g_vcStr.size()==n)
return g_vcStr[n-1];
if(n==1)
{
g_vcStr.push_back("1");
return "1";
}
string str = countAndSay(n-1);
string strResult="";
int count=1;
int i=0;
for( ; i<str.size()-1; i++)
{
if(str[i]==str[i+1])
{
count++;
}
else
{
strResult += to_string(count);
strResult.push_back(str[i]);
count=1;
}
}
strResult += to_string(count);;
strResult += str[i];
g_vcStr.push_back(strResult);
return strResult;
}
};
03 | 积累知识点
- to_string函数可以将数字转化成string类型。
网友评论