【优选算法篇】:模拟算法的力量--解决复杂问题的新视角

embedded/2025/1/15 16:28:22/

✨感谢您阅读本篇文章,文章内容是个人学习笔记的整理,如果哪里有误的话还请您指正噢✨
✨ 个人主页:余辉zmh–CSDN博客
✨ 文章所属专栏:优选算法篇–CSDN博客

在这里插入图片描述

文章目录

  • 一.模拟算法
  • 二.例题
    • 1.替换所有的问号
    • 2.提莫攻击
    • 3.外观数列
    • 4.Z字形变换
    • 5.数青蛙

一.模拟算法

模拟算法是通过计算机程序模仿现实世界中的系统或过程的方法。它首先根据要模拟的对象建立数学模型或逻辑模型,然后设置初始状态,并按照设定的规则和逻辑逐步推进模拟过程。模拟可以关注离散事件的发生和处理(如交通流量模拟),也可以模拟随时间连续变化的系统(如化学反应模拟)。模拟算法在科学研究、工程领域、商业和经济等多个领域有广泛应用,如预测交通拥堵、模拟城市发展和游戏开发中的物理运动等。通过模拟,我们可以对系统的行为进行分析,为决策提供依据。

简单的来说,其实就是根据题中要求模拟实现整个过程,通常会借助其他的算法来加以解决,下面通过几道例题来讲解什么是模拟算法

二.例题

1.替换所有的问号

题目

在这里插入图片描述

算法原理

本道题比较简单,直接根据提议要求模拟实现即可。

第一层for循环表示遍历整个字符串,第二个for循环表示遇到要替换的问号是,从字符a开始,一直到字符z,选择一个符合要求的替换问号。相邻的两个字符不能重复。

代码实现

string modifyString(string s){for (int i = 0; i < s.size();i++){if(s[i]=='?'){for (char ch = 'a'; ch < 'z';ch++){if((i==0||s[i-1]!=ch)&&(i==s.size()-1||s[i+1]!=ch)){s[i] = ch;break;}}}}return s;
}

2.提莫攻击

题目

在这里插入图片描述

算法原理

本道题模拟实现也比较简单,具体过程就是,直接计算数组中的前后两个元素的差值,如果差值大于等于中毒时间,说明是先过了整个中毒时间之后再中下一次毒;如果差值小于中毒时间,说明上一次的中毒时间还没有过完,就从新更新中毒时间,这里的差值就是中毒时间。

依次计算每一个差值然后累加,这里有一个注意点,就是最后一个元素因为没有办法计算差值,所以在最后返回结果时要再多加一个中毒时间,因为最后一次是完整的一个中毒时间。

代码实现

int findPoisonedDuration(vector<int>& timeSeries, int duration){int ret = 0;for (int i = 1; i < timeSeries.size();i++){int x = timeSeries[i] - timeSeries[i - 1];//如果前后差大于等于中毒时间,直接加上中毒时间if(x>=duration){ret += duration;}//前后差小于,加上差值else{ret += x;}}//最后要加上最后一次的中毒时间return ret + duration;
}

3.外观数列

题目

在这里插入图片描述

算法原理

在这里插入图片描述

代码实现

string countAndSay(int n){string ret = "1";string tmp;//循环次数是n-1次for (int i = 1; i < n;i++){//双指针找到相同的子串for (int left = 0, right = 0; right < ret.size();){while(right<ret.size()&&ret[left]==ret[right]){right++;}//先插入相同字串的长度tmp += to_string(right - left);//再插入数字tmp += ret[left];//更新左指针left = right;}ret = tmp;tmp.clear();}return ret;
}

4.Z字形变换

题目

在这里插入图片描述

算法原理

虽然题目中说是Z字形变换,但实际上更像是N字形变换,建议直接看成N字形

在这里插入图片描述

代码实现

string convert(string s, int numRows){if(numRows==1){return s;}string ret;int k = 0;int d = 2 * numRows - 2;//第一行while(k*d<s.size()){ret += s[0 + k * d];k++;}//中间行int i = 1;while(i<=numRows-2){k = 0;int j = d - i;while(i+k*d<s.size()||j+k*d<s.size()){ret += s[i + k * d];if(j+k*d<s.size()){ret += s[j + k * d];}k++;}i++;}//最后一行k = 0;while(numRows-1+k*d<s.size()){ret += s[numRows - 1 + k * d];k++;}return ret;
}

5.数青蛙

题目

在这里插入图片描述

算法原理

在这里插入图片描述

代码实现

int minNumberOfFrogs(string croakOfFrogs){string s="croak";unordered_map<char, pair<int,int>> hash;//将字符串croak中的每个字符存放到哈希表中,其中要建立映射关系,每个字符存放上一个的字符的下标以及个数//注意第一个字符存放的是最后一个字符的下标for (int i = 0; i < s.size();i++){if(i==0){hash[s[i]].first = s.size() - 1;}else{hash[s[i]].first = i - 1;}}for (auto ch : croakOfFrogs){if(hash[s[hash[ch].first]].second){hash[s[hash[ch].first]].second--;hash[ch].second++;}else{if(ch=='c'){hash[ch].second++;}else{return -1;}}}//最后遍历整个哈希表,除了最后一个,如果出现非零元素,直接返回-1for (int i = 0;i<s.size()-1;i++){if(hash[s[i]].second){return -1;}}//返回哈希表中最后一个字符的个数return hash[s[s.size() - 1]].second;
}

以上就是关于模拟算法的讲解,如果哪里有错的话,可以在评论区指正,也欢迎大家一起讨论学习,如果对你的学习有帮助的话,点点赞关注支持一下吧!!!
在这里插入图片描述


http://www.ppmy.cn/embedded/154137.html

相关文章

企业AI助理的自然语言处理:提升客服服务质量

在当今竞争激烈的市场环境中&#xff0c;优质的客户服务已成为企业脱颖而出的重要法宝。自然语言处理&#xff08;NLP&#xff09;技术在企业AI助理中的应用&#xff0c;极大地提升了客服服务的质量和效率&#xff0c;为企业带来了显著的竞争优势。 一、自然语言处理技术在企业…

Python对接GitHub:详细操作指南

在现代软件开发中,GitHub已经成为不可或缺的代码托管和版本控制平台。作为开发者,能够通过编程方式与GitHub交互可以大大提高工作效率。本文将详细介绍如何使用Python对接GitHub,实现仓库管理、文件操作、Issue处理、Pull Request管理以及Tag操作等功能。 © ivwdcwso (ID:…

Opus Clip AI技术浅析(二):上传与预处理

1. 视频上传 1.1 用户接口 用户通过网页或移动应用上传视频文件。文件上传通常使用HTTP协议&#xff0c;支持多种视频格式&#xff08;如MP4, AVI, MOV等&#xff09;。上传接口需要处理大文件上传、断点续传等问题。 1.2 文件传输 上传的视频文件通过安全的传输协议&#…

量子计算:从薛定谔的猫到你的生活

文章背景 说到量子计算&#xff0c;不少人觉得它神秘又遥不可及。其实&#xff0c;它只是量子物理学的一个“应用小分支”。它的核心在于量子比特的“叠加”和“纠缠”&#xff0c;这些听上去像科幻小说的概念&#xff0c;却为计算世界开辟了一片全新的天地。如果经典计算是“…

intel x99主板设置上电服务器自动启动

作者&#xff1a;吴业亮 博客&#xff1a;wuyeliang.blog.csdn.net 1、选择IntelRCStetup–>PCH state after G3 -->ON PCH state after G3&#xff1a;是指系统完全关闭电源的状态&#xff0c;此时主板上只有RTC&#xff08;实时时钟&#xff09;电源。这个选项决定了系…

深入解析 IPoIB 驱动中的多播功能实现

引言 InfiniBand(IB)是一种高性能、低延迟的网络互连技术,广泛应用于高性能计算(HPC)和数据中心。IP over InfiniBand(IPoIB)是一种将 IP 协议封装在 InfiniBand 网络上的技术,允许在 InfiniBand 网络上运行标准的 IP 应用程序。多播(Multicast)是 IPoIB 的一个重要…

C++----STL(string)

引言&#xff1a;STL简介 什么是STL STL(standard template libaray-标准模板库)&#xff1a; 是 C标准库的重要组成部分&#xff08;注意&#xff1a;STL只是C标准库里的一部分&#xff0c;cin和cout也是属于C标准库的&#xff09;&#xff0c;不仅是一个可复用的组件库&…

如何选择多个视频文件

文章目录 1. 概念介绍2. 方法与细节2.1 实现方法2.2 具体细节 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何选择多个图片文件"相关的内容&#xff0c;本章回中将介绍如何选择视频文件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在前…