知识点:字符串+递归+循环
记录:对题目的理解,最初看到题目的时候并没有读懂题意,
1 1
2 11 //1(个)1
3 21 //2(个) 1
4 1211 //1(个)2 1(个)1
规律,第n个序列的字符串只与第 n-1个序列的字符串有关,因此用函数递归实现的方式如下:
class Solution {
public:
string countAndSay(int n) {//返回一个字符串,接收参数为一个整形数
if(n == 1) //n为1时直接返回“1”
return "1";
string str = countAndSay(n - 1); //递归调用,第n-1对应的序列
string res; //保存结果
for(int i = 0; i < str.length();i++ ) //根据序列n-1给出对应的n对应的序列
{
int j = i + 1; //j初始化为1
while(str[j] == str[i] && j < str.length())//如果相等,统计连续相同数字的个数
++j;
int quantity = j - i; //计算序列n-1中连续相同数字的个数
res.push_back(quantity + '0');//+'0'
res.push_back(str[i]);
i = j;//更新i
}
return res;
}
};
以上方法是学习别人的博客的,然而测试发现当n=4时结果错误。
以下用循环方法实现:
class Solution {
public:
string countAndSay(int n) {//返回一个字符串,接收参数为一个整形数
string s = "1";//初始化返回字符串
//循环的方法
for (int i = 1; i < n; i++) {
string tmp;//存储第i次的数字序列
for (int j = 0; j < s.size(); j++) {
int count = 1;
while (j+1 < s.size() && s[j+1] == s[j]) { //统计重复
count++;//统计连续相等的数字的数目
j++; //相当于指针变量,遍历序列中的数字
}
tmp += to_string(count) + s[j]; //如果连续数字不相等,count即为1
}
s = tmp; //更新字符串
}
return s;
}
};