算法:模拟思想算法

文章目录

本篇总结的是模拟算法

实现原理

模拟算法的实现原理很简单,就是依据题意实现题意的目的即可,考察的是你能不能实现题目题意的代码能力

算法思路

没有很明显的算法思路,就是根据题意完成目标即可

优化

任何算法都是会有一定的优化空间的,那么在所有模拟的题型中,大多数的题目都是通过找规律来解决问题的,通过找规律可以避免掉很多繁琐的步骤

典型例题

替换所有问号

正如前面的算法原理所说,模拟的算法就是实现题目意思,以此题为例,和题目意思相同,就是替换所有问号即可

cpp 复制代码
class Solution 
{
public:
    string modifyString(string s) 
    {
        int n=s.size();
        if(n==1)
        {
            return "a";
        }
        if(s[0]=='?')
        {
            for(int i='a';i<='z';i++)
            {
                if(i!=s[1])
                {
                    s[0]=i;
                    break;
                }
            }
        }
        if(s[n-1]=='?')
        {
            for(int i='a';i<='z';i++)
            {
                if(i!=s[n-2])
                {
                    s[n-1]=i;
                    break;
                }
            }
        }
        for(int i=0;i<n;i++)
        {
            if(s[i]=='?')
            {
                for(int j='a';j<='z';j++)
                {
                    if(j!=s[i-1] && j!=s[i+1])
                    {
                        s[i]=j;
                        break;
                    }
                }
            }
        }
        return s;
    }
};

提莫攻击

题意也相当简单,直接根据题意模拟即可~

cpp 复制代码
class Solution 
{
public:
    int findPoisonedDuration(vector<int>& timeSeries, int duration) 
    {
        int sum=0;
        for(int i=0;i<timeSeries.size()-1;i++)
        {
            if(timeSeries[i]+duration<=timeSeries[i+1])
            {
                sum+=duration;
            }
            else
            {
                sum+=timeSeries[i+1]-timeSeries[i];
            }
        }
        sum+=duration;
        return sum;
    }
};

N字型变换

这里展示的是直接使用模拟算法的情况下,可以通过这样的方法进行解决

对于此题来说,还可以通过找规律的方法解决

cpp 复制代码
class Solution 
{
public:
    string convert(string s, int numRows)
    {
        int p=1000;
        string ans;
        vector<vector<char>> v(numRows, vector <char>(p));
        int k = 0;
        int i = 0;
        while (k < s.size())
        {
            for (int j = 0; j < numRows && k < s.size(); j++)
            {
                v[j][i] = s[k++];
            }
            for (int m = numRows - 2; m > 0 && k < s.size(); m--)
            {
                v[m][++i] = s[k++];
            }
            i++;
        }
        for (int i = 0; i < numRows; i++)
        {
            for (int j = 0; j < p; j++)
            {
                if (v[i][j] != 0)
                {
                    ans.push_back(v[i][j]);
                }
            }
        }
        return ans;
    }
};

找规律

如果按下标的形式进行填充,此时再进行观察就会发现是相对容易的

第一行和最后一行每次需要找的数其实是有固定的公差的,而中间部分也有固定规律,因此在写返回的字符串的时候,就可以使用这个原理,分成三部分,先填第一行,再填中间部分,再填最后一行,这样三个模块都填写完毕后字符串也就形成了

外观序列

此题也是很经典的模拟题,直接根据题意总结即可,强行模拟就可通过,借助一个双指针可以更方便的寻找规律

cpp 复制代码
class Solution 
{
public:
    string countAndSay(int n) 
    {
        string ret="1";
        for(int i=1;i<n;i++)
        {
            int left=0,right=0;
            int count=0;
            string tmp;
            while(right<ret.size())
            {
                while(ret[right]==ret[left])
                {
                    right++;
                }
                count=right-left;
                tmp+=count+'0';
                tmp+=ret[left];
                left=right;
            }
            ret=tmp;
        }
        return ret;
    }
};

总结

模拟算法和前面相比,实际上不需要过多的算法思维,只需要强行根据题意写出代码即可,但是需要一定的代码能力,如果有代码能力,原照原根据题意进行复刻即可,总体来说还是相对简单的一套算法

相关推荐
YLCHUP2 小时前
【思维&图论建模】题解:债权(debt)_图论_建模_思路转化_思维题目_C++算法竞赛
c++·笔记·算法·数学建模·贪心算法·深度优先·图论
xiaoye-duck3 小时前
《C++ 项目:手写大模型接入 SDK》会话模块整合:内存 SessionManager 与 DataManager 持久化联动
开发语言·数据库·c++·语言模型
思麟呀3 小时前
背包DP(01背包+完全背包)
c++·算法
旖旎夜光4 小时前
【C++ 基础入门】C++11 新特性(中):右值引用、移动语义与完美转发
开发语言·c++·笔记·学习
ShineWinsu5 小时前
对于Qt:QTabWidget常见属性的解析
开发语言·数据库·c++·qt·浏览器·qtabwidget·标签页
俊俊几年的6 小时前
动态规划(Dynamic Programming)详解:从入门到 LeetCode Hot 100
linux·c++·算法·leetcode·嵌入式·动态规划·c
老歌老听老掉牙1 天前
案例 7:二维 Rosenbrock 函数最小值(香蕉函数)
c++·pso
Severus_black1 天前
【C++初阶】Stack、Queue算法题大练兵!
c语言·c++·算法·stl
xiaoye-duck1 天前
《C++ 项目:手写大模型接入 SDK》DataManager数据管理模块:SQLite持久化存储
开发语言·数据库·c++·sqlite
是main不是漫1 天前
【C++——类和对象(上)】筑基篇:以封装奠定面向对象之基
c语言·开发语言·c++