
上篇我们介绍了模拟算法的原理概念及部分基础题型,本篇将结合进阶题目,深化对于模拟算法的理解运用。
题目要求按规则返回字符串,元素n代表需要阐述n次,其中每一次都是对上一次元素内容的说明。 例如1->1 2->11 3->21
所谓「外观数列」,其实只是依次统计字符串中连续且相同的字符的个数。依照题意,依次模拟即可。
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;
}
};模拟青蛙的叫声:
具体步骤如下:
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];
}
};模拟算法在现代科技中扮演着“虚拟工匠”的角色,承载了现实与数字世界的桥梁之梦。它不仅是一种计算工具,更是一门艺术,一种用逻辑与数据描绘现实的艺术。
“镜中缘,风中影,算法描绘万象生。” 让我们踏上这段探索之旅,在数字模拟的镜像中窥见未来的可能性。
本篇关于模拟算法的讲解就暂告段落啦,希望能对大家的学习产生帮助,欢迎各位佬前来支持斧正!!!