题解:
这道题目的其实是很简单的(难度的分类也是简单),但是乍一看并不是那么好做,首先看懂题目意思:
比如1211,怎么报数呢?从左到右开始报数:1个1、1个2、2个1 => 111221
第一种解法:
n最大为30,那我就一个个地数出来,不过这方法太耗时间了,而且容易出错。
第二种解法:
- 写一个
getCountResultBySqe(string str)
,传入一个字符串,比如1211
,得到报数的结果为111221
。- 写一个递归(循环也可以),当n==1时,直接返回
1
,否则返回getCountResultBySqe(countAndSay(n - 1))
,其实也就是自顶向下求出对应的报数结果。
代码(递归):
class Solution {
public:
string countAndSay(int n) {
// 比如:1211,就是1个1、1个2、2个1 => 111221
// 1:1
// 2:11
// 3:21
// 4:1211
// 5:111221
// 6:312211
// 7:13112211
// 8:1113212221
if(n == 1)
{
return "1";
}
return getCountResultBySqe(countAndSay(n - 1));
}
string getCountResultBySqe(string str)
{
// 给定一个序列得到报数的结果
string res = "";
int i = 1;
int cnt = 1;
char pre = str[0];
while(i < (int)str.size())
{
if(str[i] == pre)
{
cnt++;
}
else
{
char cnt_ch = '0' + cnt;
res += cnt_ch;
res += pre;
cnt = 1;
pre = str[i];
}
i++;
}
char cnt_ch = '0' + cnt;
res += cnt_ch;
res += pre;
return res;
}
};
代码(循环):
class Solution {
public:
string countAndSay(int n) {
string str = "1";
for(int i = 1; i <= n-1; i++)
{
str = getCountResultBySqe(str);
}
return str;
}
string getCountResultBySqe(string str)
{
// 给定一个序列得到报数的结果
string res = "";
int i = 1;
int cnt = 1;
char pre = str[0];
while(i < (int)str.size())
{
if(str[i] == pre)
{
cnt++;
}
else
{
char cnt_ch = '0' + cnt;
res += cnt_ch;
res += pre;
cnt = 1;
pre = str[i];
}
i++;
}
char cnt_ch = '0' + cnt;
res += cnt_ch;
res += pre;
return res;
}
};