✨✨✨学习的道路很枯燥,希望我们能并肩走下来!
文章目录
目录
文章目录
前言
一. 模拟算法的总结
二. 模拟算法题目
2.1 替换所有的问号
2.2 提莫攻击
2.3 Z字形变换
2.4 外观数列
2.5 数青蛙
总结
前言
本篇详细介绍了模拟算法的使用,让使用者了解模拟算法,而不是仅仅停留在表面, 文章可能出现错误,如有请在评论区指正,让我们一起交流,共同进步!
一. 模拟算法的总结
模拟,属于入门级算法,顾名思义,就是让电脑按照题目所给出的方法来运行,最终输出所需要的结果的过程。本篇主要是从模拟算法的概念和实例进行讲解和分析。
二. 模拟算法题目
2.1 替换所有的问号
1576. 替换所有的问号 - 力扣(LeetCode)
class Solution {
public:
string modifyString(string s) {
int n = s.size();
for(int i = 0;i<n;i++)
{
if(s[i] == '?')
{
for(char ch = 'a';ch<='z';ch++)
{
if((i == 0 || s[i-1] != ch) && (i == n-1 || s[i+1] != ch))
{
s[i] = ch;
break;
}
}
}
}
return s;
}
};
2.2 提莫攻击
495. 提莫攻击 - 力扣(LeetCode)
class Solution {
public:
int findPoisonedDuration(vector<int>& timeSeries, int duration) {
int ret = duration;
for(int i = 0;i<timeSeries.size()-1;i++)
{
int x = timeSeries[i+1] - timeSeries[i];
if(x<duration) ret+=x;
else ret+=duration;
}
return ret;
}
};
2.3 Z字形变换
6. Z 字形变换 - 力扣(LeetCode)
class Solution {
public:
string convert(string s, int numRows) {
//处理边界情况
if(numRows == 1) return s;
string ret;
int d = 2*numRows-2;
int n = s.size();
//1. 先处理第一行
for(int i = 0;i<n;i+=d)
ret+=s[i];
//2. 处理中间行
for(int k = 1;k<numRows-1;k++)
{
for(int i = k,j = d-k;i<n||j<n;i+=d,j+=d)
{
if(i<n) ret+=s[i];
if(j<n) ret+=s[j];
}
}
//3. 处理最后一行
for(int i = numRows-1; i<n; i+=d)
ret+=s[i];
return ret;
}
};
2.4 外观数列
38. 外观数列 - 力扣(LeetCode)
class Solution {
public:
string countAndSay(int n) {
string ret = "1";
for(int i = 1;i<n;i++) //解释n-1次ret即可
{
string tmp;
int n = ret.size();
for(int left = 0,right = 0;right<n;)
{
while(right<n&&ret[left] == ret[right]) right++;
tmp+=to_string(right - left)+ret[left];
left = right;
}
ret = tmp;
}
return ret;
}
};
2.5 数青蛙
1419. 数青蛙 - 力扣(LeetCode)
class Solution {
public:
int minNumberOfFrogs(string croakOfFrogs) {
string t = "croak";
int n = t.size();
vector<int> hash(n); //用数组来模拟哈希表
unordered_map<char,int> index; //[x,x字符在hash中对应的下标] ——为了找前驱字符的下标
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];
}
};
总结
✨✨✨各位读友,本篇分享到内容是否更好的让你理解模拟算法,如果对你有帮助给个👍赞鼓励一下吧!!
🎉🎉🎉世上没有绝望的处境,只有对处境绝望的人。
感谢每一位一起走到这的伙伴,我们可以一起交流进步!!!一起加油吧!!