网站和公众号的区别,wordpress 模板 中文乱码,金华网站建设,营销网站建设选择✨感谢您阅读本篇文章#xff0c;文章内容是个人学习笔记的整理#xff0c;如果哪里有误的话还请您指正噢✨ ✨ 个人主页#xff1a;余辉zmh–CSDN博客 ✨ 文章所属专栏#xff1a;优选算法篇–CSDN博客 文章目录 一.模拟算法二.例题1.替换所有的问号2.提莫攻击3.外观数列4… ✨感谢您阅读本篇文章文章内容是个人学习笔记的整理如果哪里有误的话还请您指正噢✨ ✨ 个人主页余辉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((i0||s[i-1]!ch)(is.size()-1||s[i1]!ch)){s[i] ch;break;}}}}return s;
}2.提莫攻击
题目 算法原理
本道题模拟实现也比较简单具体过程就是直接计算数组中的前后两个元素的差值如果差值大于等于中毒时间说明是先过了整个中毒时间之后再中下一次毒如果差值小于中毒时间说明上一次的中毒时间还没有过完就从新更新中毒时间这里的差值就是中毒时间。
依次计算每一个差值然后累加这里有一个注意点就是最后一个元素因为没有办法计算差值所以在最后返回结果时要再多加一个中毒时间因为最后一次是完整的一个中毒时间。
代码实现
int findPoisonedDuration(vectorint timeSeries, int duration){int ret 0;for (int i 1; i timeSeries.size();i){int x timeSeries[i] - timeSeries[i - 1];//如果前后差大于等于中毒时间直接加上中毒时间if(xduration){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(rightret.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(numRows1){return s;}string ret;int k 0;int d 2 * numRows - 2;//第一行while(k*ds.size()){ret s[0 k * d];k;}//中间行int i 1;while(inumRows-2){k 0;int j d - i;while(ik*ds.size()||jk*ds.size()){ret s[i k * d];if(jk*ds.size()){ret s[j k * d];}k;}i;}//最后一行k 0;while(numRows-1k*ds.size()){ret s[numRows - 1 k * d];k;}return ret;
}
5.数青蛙
题目 算法原理 代码实现
int minNumberOfFrogs(string croakOfFrogs){string scroak;unordered_mapchar, pairint,int hash;//将字符串croak中的每个字符存放到哈希表中其中要建立映射关系每个字符存放上一个的字符的下标以及个数//注意第一个字符存放的是最后一个字符的下标for (int i 0; i s.size();i){if(i0){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(chc){hash[ch].second;}else{return -1;}}}//最后遍历整个哈希表除了最后一个如果出现非零元素直接返回-1for (int i 0;is.size()-1;i){if(hash[s[i]].second){return -1;}}//返回哈希表中最后一个字符的个数return hash[s[s.size() - 1]].second;
}以上就是关于模拟算法的讲解如果哪里有错的话可以在评论区指正也欢迎大家一起讨论学习如果对你的学习有帮助的话点点赞关注支持一下吧