Leetcode 38 外观数列
lc 第38题 外观数列 难度:简单
然鹅我第二遍依然没有做出来!!!
思路:
1.从第二个数开始,每一个数都是前一个数的描述,可以理解成递归,想要知道第n个数如何描述,那就一定要知道n-1个数如何描述,n-1则由n-2知道…一直到第一个数
2.所以我们可以就按照这个想法开始模拟,从第一个数开始 开始描述这个数
eg: 1 “1” 描述成 “11”
2 “11” 描述成 ”21“ 这里可以看到第二项其实就是第一项的结果
接下来代码
string countstring(int n){
string s="1"; //这里先知道第一项就是“1”,从这里开始模拟
for(int i=1;i<n;i++) {
s=nextstr(s);//这里就是我们思路说的,每一项都是前一项的结果!!!我第一次就是没有想到这样写
}
return s;
}
string nextstr(string s){
int n=s.size();
int pre=s[0];//记录一下第一个字符,方便我们后面跟剩余字符比较,不一样则更新字符
int cnt=1;//记录字符出现的数量,因为这里已经记录了第一个字符,所以起始所以肯定为1,可以自己手动模拟一下
string res; //这是我们最后存答案的地方
for(int i=1;i<s.size();i++){
if(pre==s[i]){
cnt++;
}else{//如果不一样
res+=to_string(cnt);//由于字符串push_back不支持添加字符串,所以这里只能用+=或者append
res.push_back(pre);
cnt=1;//更新次数
pre=s[i];
}
}//这里我们是没有添加一个最后的字符,可以模拟一下,如果是“1233”,那么最后一个字符也是3,只会执行相等语句,此时i会等于s.size()跳出循环,并没有放进去答案中,同理可以推“1224”,只会放进去2,而此时“4”没有放进去
res+=to_string(cnt);//加上放进去的字符数量
res.push_back(pre);
return res;
}