LeetCode/外观数列

给定一个正整数 n ,输出外观数列的第 n 项
「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述

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();//这里要补上最后一组字符
    }
};

2. 遍历

判断组头是否相等可以避免额外处理,统一操作
使用两个下标记录位置

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;
    }
};
posted @ 2022-07-27 20:23  失控D大白兔  阅读(19)  评论(0编辑  收藏  举报