模拟篇——算法浮世绘,探寻模拟之境的计算艺术(2)

前言

上篇我们介绍了模拟算法的原理概念及部分基础题型,本篇将结合进阶题目,深化对于模拟算法的理解运用。

一. 外观数列

1.1 题目链接:https://leetcode.cn/problems/count-and-say/description/

1.2 题目分析:

题目要求按规则返回字符串,元素n代表需要阐述n次,其中每一次都是对上一次元素内容的说明。

例如1->1

2->11

3->21

1.3 思路讲解:

所谓「外观数列」,其实只是依次统计字符串中连续且相同的字符的个数。依照题意,依次模拟即可。

1.4 代码实现:

cpp 复制代码
class Solution {
public:
    string countAndSay(int n) {
        string ret="1";
        //需要解释n-1次
        for(int i=1;i<n;i++)
        {
            string temp;
            int len=ret.size();
            for(int left=0,right=0;right<len;)
            {
                while(right<len&&ret[left]==ret[right])
                {
                    right++;
                }//相同元素的个数
                temp+=(to_string(right-left))+ret[left];
                left=right;//更新left
            }
            ret=temp;//更新每一次解释结果
        }
        return ret;
        
    }
};

二. 数青蛙

2.1 题目链接:https://leetcode.cn/problems/minimum-number-of-frogs-croaking/description/

2.2 题目分析:

  • croak单词代表蛙鸣,青蛙必须按顺序c,r,o,a,k依次鸣叫,如果字符串不符合鸣叫顺序,则直接返回-1
  • 同一时间可以有多只青蛙鸣叫
  • 单只青蛙完成本次鸣叫后可以继续鸣叫
  • 求取完成鸣叫所需的最少青蛙数目

2.3 思路讲解:

模拟青蛙的叫声:

  • 当遇到 'r' 'o' 'a' 'k' 这四个字符的时候,我们要去看看每⼀个字符对应的前驱字符,有没有⻘蛙叫出来。如果有⻘蛙叫出来,那就让这个⻘蛙接下来喊出来这个字符;如果没有,直接返回 -1 ;
  • 当遇到 'c' 这个字符的时候,我们去看看 'k' 这个字符有没有⻘蛙叫出来。如果有,就让这个⻘蛙继续去喊 'c' 这个字符;如果没有的话,就需要再来⼀个⻘蛙。

具体步骤如下:

  1. 创建一个哈希表用来记录字符及其前驱字符的鸣叫情况
  2. 利用croak的下标与哈希表映射对应,分情况一一判断

1.4 代码实现:

cpp 复制代码
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;
       }//index与下标一一对应
       for(auto e:croakOfFrogs)
       {
        if(e=='c')
        {
            if(hash[4]>0)
            {
                hash[0]++;
                hash[4]--;
            }//直接令该青蛙继续鸣叫
            else
            {
                hash[0]++;
            }
        }
        else
        {
            int i=index[e];//该元素下标
            if(hash[i-1]<1)//前方无可继续鸣叫的青蛙
            {
                return -1;
            }
            else
            {
                hash[i-1]--;
                hash[i]++;
            }//更新哈希表
        }
       }
        for(int i=0;i<n-1;i++)
        {
            if(hash[i]!=0)
            {
                return -1;
            }
        }//全部鸣叫后应该只有hash[4]不为0,代表青蛙个数
        return hash[4];
        
    }
};

三. 实际应用场景

  • 工程与科学研究

    模拟算法广泛应用于航空航天、材料科学等领域,如模拟飞行器空气动力学特性或预测新材料的性能。

  • 游戏开发与虚拟现实

    在游戏与VR中,模拟算法赋予虚拟角色真实行为,营造身临其境的体验,例如模拟天气变化或物理碰撞效果。

  • 经济与社会系统建模

    通过模拟市场行为或社会网络传播模式,分析经济政策或舆论传播的潜在影响。

  • 人工智能与机器学习

    模拟环境为强化学习算法提供训练场景,例如无人车的虚拟驾驶测试。

小结

模拟算法在现代科技中扮演着"虚拟工匠"的角色,承载了现实与数字世界的桥梁之梦。它不仅是一种计算工具,更是一门艺术,一种用逻辑与数据描绘现实的艺术。

"镜中缘,风中影,算法描绘万象生。"
让我们踏上这段探索之旅,在数字模拟的镜像中窥见未来的可能性。

本篇关于模拟算法的讲解就暂告段落啦,希望能对大家的学习产生帮助,欢迎各位佬前来支持斧正!!!

相关推荐
c++初学者ABC16 分钟前
蓝桥杯算法训练 黑色星期五
c++·算法·蓝桥杯
逆袭之路66634 分钟前
c++死锁调试 ,gdb pstack
c++
十年一梦实验室1 小时前
【C++】sophus : test_macros.hpp 用于单元测试的宏和辅助函数 (四)
开发语言·c++·单元测试
二闹1 小时前
青训营试题算法解析十九
后端·算法
不想当程序猿_1 小时前
【蓝桥杯每日一题】扫描游戏——线段树
c++·算法·蓝桥杯·线段树·模拟
老猿讲编程1 小时前
在 macOS 下安装和使用 Clang Static Analyzer
c++·macos
Jambo!2 小时前
Visual studio中C/C++连接mysql
c语言·c++·mysql·visual studio
Mr.132 小时前
如何实现对象的克隆?如何实现单例模式?
c++·单例模式
SoraLuna2 小时前
「Mac畅玩鸿蒙与硬件46」UI互动应用篇23 - 自定义天气预报组件
开发语言·算法·macos·ui·华为·harmonyos
KaiPeng-Nie2 小时前
代码随想录day22 | 回溯算法理论基础 leetcode 77.组合 77.组合 加剪枝操作 216.组合总和III 17.电话号码的字母组合
java·算法·leetcode·剪枝·回溯算法·回归算法·递归函数