给定一个正整数 n ,输出外观数列的第 n 项
「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述
判断相邻相等的方法每次只能处理上一个值
等价于每次比较上一个组的末位置与当前组的初始位置
最后一个值要额外处理
class Solution { public: string countAndSay(int n) { if(n==1) return "1";//递归边界 string s=countAndSay(n-1);//从上一层结果继续生成 string ans=""; int count=1;//初始值为1 for(int i=1;i<s.length();i++){ if(s[i]==s[i-1]) count++;//相等则计数加 else{ ans+=(to_string(count)+s[i-1]);//否则先输出前一个值 count=1;//重置计数 } } return ans+to_string(count)+s.back();//这里要补上最后一组字符 } };
判断组头是否相等可以避免额外处理,统一操作
使用两个下标记录位置
class Solution { public: string countAndSay(int n) { string prev = "1"; for (int i = 2; i <= n; ++i) { string curr = "";//重置cur int start = 0;//当前组起始位置 int pos = 0;//当前组末位置 while (pos < prev.size()) {//遍历所有字符 while (pos < prev.size() && prev[pos] == prev[start]) pos++;//定位到不重复位置 curr += to_string(pos - start) + prev[start]; start = pos; } prev = curr;//更新pre } return prev; } };