LeetCode模拟算法精解II:外观数列与数青蛙

上篇文章:LeetCode模拟算法精解I:替换问号,提莫攻击与Z字形变换

目录

1.外观数列

理解题意

算法原理

2.数青蛙

理解题意

算法原理


1.外观数列

https://leetcode.cn/problems/count-and-say/description/

理解题意

  1. 给一个数,这个数是1
  2. 描述上一步的数,这个数是 1 即一个1,故写作11
  3. 描述上一步的数,这个数是11即两个1,故写作21
  4. 描述上一步的数,这个数是21即一个2一个1,故写作12-11
  5. 描述上一步的数,这个数是1211即一个1一个2两个1,故写作11-12-21

算法原理

通过模拟和双指针,对给定的数字进行解释。

复制代码
class Solution 
{
public:
    string countAndSay(int n) 
    {
        string ret = "1";
        for(int i = 1; i < n; i++) // 遍历
        {
            string tmp;
            int len = ret.size();
            for(int left = 0, right = 0; right < len; ) // 解释ret
            {
                while(right < len && ret[left] == ret[right])
                {
                    right++;
                }
                tmp += to_string(right - left) + ret[left];
                left = right;
            }
            ret = tmp;
        }
        return ret;
    }
};

2.数青蛙

https://leetcode.cn/problems/minimum-number-of-frogs-croaking/description/

理解题意

计算在字符串中字符c,r,o,a,k出现的次数,只要顺序不变,出现次数合理,哪怕有若干个随意穿插,也属于有效字符。

算法原理

本题要求出现次数以及确定顺序和重复度,所以使用哈希表(数组模拟实现)进行判断。

基本判断如下:

复制代码
class Solution 
{
public:
    int minNumberOfFrogs(string croakOfFrogs) 
    {
        string t = "croak";
        int n = t.size();
        vector<int> hash(n); // 数组模拟哈希表

        unordered_map<char, int> index; // 字符对应下标
        for(int i = 0; i < n; i++)
        {
            index[t[i]] = i;
        }

        for(auto ch : croakOfFrogs)
        {
            if(ch == 'c')
            {
                if(hash[n - 1] != 0) hash[n - 1]--;
                hash[0]++;
            }  
            else
            {
                int i = index[ch];
                if(hash[i - 1] == 0) return -1;
                hash[i - 1]--; hash[i]++;
            }
        }

        for(int i = 0; i < n - 1; i++)
        {
            if(hash[i] != 0)
                return -1;
        }
        return hash[n - 1];
    }
};

本章完。

相关推荐
致Great28 分钟前
科研人的 AI,不该只回答问题:我用字节TraeWork 跑了一遍真实研究任务
算法
纵有疾風起31 分钟前
线性表的定义与基本操作 — 从逻辑结构到 ADT 接口
数据结构·算法·408·线性表·adt
charlie1145141911 小时前
Cinux · 第一次跳进 Ring 3:用户态与特权隔离
开发语言·c++·操作系统·开源项目
别动我齐刘海1 小时前
机器学习基础2——C++、OpenCV、点云、Open3D
c++·人工智能·opencv·机器学习·计算机视觉·机器人·ros2
wuyk5551 小时前
1.栈:后进先出的线性数据结构
c语言·数据结构·stm32·单片机
测试_AI_一辰1 小时前
AI Agent 评测最隐蔽的坑-记忆
人工智能·算法·ai·自动化·ai编程
躺不平的理查德1 小时前
Windows C++ 第三方库使用流程备忘录--OpenCV
开发语言·c++
余额瞒着我当琳1 小时前
C++STL容器string--迭代器,string的接口,string的遍历,访问方式
c++
郭涤生1 小时前
rootfs 详解与裁剪优化记录
linux·c++·bsp
lucas_AI1 小时前
给YOLO检测器插 LoRA,'插对地方'比'插什么'更要命
人工智能·算法