算法(6)——模拟

一、什么是模拟

模拟是对真实事物或者过程的虚拟。在编程时为了实现某个功能,可以用语言来模拟那个功能,模拟成功也就相应地表示编程成功。

二、模拟算法的思路

模拟算法是一种基本的算法思想,可用于考查程序员的基本编程能力,其解决方法就是根据题目给出的规则对题目要求的相关过程进行编程模拟,说白了,就是题目说什么就做什么。在解决模拟类问题时,需要注意字符串处理、特殊情况处理和对题目意思的理解。

在C语言中,通常使用函数 srand() 和 rand() 来生成随机数。其中,函数 srand() 用于初始化随机数发生器,然后使用函数 rand() 来生成随机数。如果要使用上述两个函数,则需要在源程序头部包含 time.h 文件。在程序设计过程中,可使用随机函数来模拟自然界中发生的不可预测情况。在解题时,需要仔细分析题目给出的规则,要尽可能地做到全面考虑所有可能出现的情况,这是解模拟类问题的关键点之一。

三、模拟算法的特点和技巧

特点:

        代码量大

        操作多

        思路复杂

        较为复杂的模拟题出错后难定位错误

技巧:

       1、在动手写代码之前,在草纸上尽可能地写好要实现的流程.

       2、在代码中,尽量把每个部分模块化,写成函数、结构体或类

       3、对于一些可能重复用到的概念,可以统一转化,方便处理:如,某题给你"YY-MM-DD 时:分" 把它抽取到一个函数,处理成秒,会减少概念混淆

       4、调试时分块调试。模块化的好处就是可以方便的单独调某一部分

       5、写代码的时候一定要思路清晰,不要想到什么写什么,要按照落在纸上的步骤写

三、模拟OJ题

3.1、替换所有的问号

1576. 替换所有的问号 - 力扣(LeetCode)

        题目描述

        算法思路

纯模拟。从前往后遍历整个字符串,找到问号之后,就⽤ a ~ z 的每⼀个字符去尝试替换即可。
        算法代码 
class Solution {
public:
    string modifyString(string s) 
    {
        for(int i=0;i<s.size();i++)
        {
            if(s[i]=='?')
            {
                for(char j='a';j<='z';j++)
                {
                    if((i==0||j!=s[i-1])&&(i==s.size()-1||j!=s[i+1]))
                    {
                        s[i]=j;
                    }
                }
            }
        }
        return s;
    }
};

3.2、提莫攻击

495. 提莫攻击 - 力扣(LeetCode)

        题目描述

        算法思路

模拟 + 分情况讨论。

计算相邻两个时间点的差值:

        i. 如果差值⼤于等于中毒时间,说明上次中毒可以持续 duration 秒;

        ii. 如果差值⼩于中毒时间,那么上次的中毒只能持续两者的差值。
        代码实现
class Solution {
public:
    int findPoisonedDuration(vector<int>& timeSeries, int duration) 
    {
        int n=timeSeries.size();
        int sum=0;
        for(int i=1;i<n;i++)
        {
            if(timeSeries[i]-timeSeries[i-1]>=duration)
            {
                sum+=duration;
            }
            else
            {
                sum+=timeSeries[i]-timeSeries[i-1];
            }
        }
        return sum+duration;
    }
};

3.3、N字形变换

6. Z 字形变换 - 力扣(LeetCode)

        题目描述

        算法思路

这个 Z 字型其实是这样的:

对于前面的  3 行的  示例1 , 它的字符数分布是这样的

对于前面的 4 行的 示例2 , 它的字符数分布是这样的:

那么对于 n 行的字符数分布是这样的:

如上图所示,我们可以发现:

1.当前行 curRow 为 0 或 n-1 时,箭头发生反向转折。
方法一: 从左到右按箭头方向迭代 s ,将每个字符添加到合适的行。之后从上到下遍历行即可。

我们假定 n=numRows :

class Solution {
public:
	string convert(string s, int numRows) {

		if (numRows == 1) return s;

		vector<string> rows(min(numRows, int(s.size()))); // 防止s的长度小于行数
		int curRow = 0;
		bool goingDown = false;

		for (char c : s) {
			rows[curRow] += c;
			if (curRow == 0 || curRow == numRows - 1) {// 当前行curRow为0或numRows -1时,箭头发生反向转折
				goingDown = !goingDown;
			}
			curRow += goingDown ? 1 : -1;
		}

		string ret;
		for (string row : rows) {// 从上到下遍历行
			ret += row;
		}

		return ret;
	}
};

3.4、外观数列

38. 外观数列 - 力扣(LeetCode)

        题目描述

        算法思路

所谓「外观数列」,其实只是依次统计字符串中连续且相同的字符的个数。依照题意,依次模拟即
可。

        代码实现

class Solution {
public:
    string countAndSay(int n) 
    {
        string ret="1";
        for(int i=1;i<n;i++)  //翻译n-1次
        {
            string temp;
            int len =ret.size();
            for(int left=0,right=0;right<len;)
            {
                while(right<len&&ret[right]==ret[left]) right++;
                temp+=(right-left)+'0';
                temp+=ret[left];
                left=right;
            }
            ret=temp;
        }
        return ret;
    }
};

3.5、数青蛙

        题目描述

        算法思路

(快排思想 - 三指针法使数组分三块)

类⽐数组分两块的算法思想,这⾥是将数组分成三块,那么我们可以再添加⼀个指针,实现数组分
三块。
设数组⼤⼩为 n ,定义三个指针 left, cur, right :
        ◦ left :⽤来标记 0 序列的末尾,因此初始化为 -1
        ◦ cur :⽤来扫描数组,初始化为 0
        ◦ right :⽤来标记 2 序列的起始位置,因此初始化为 n
cur 往后扫描的过程中,保证:
        ◦ [0, left] 内的元素都是 0
        ◦ [left + 1, cur - 1] 内的元素都是 1

        [cur, right - 1] 内的元素是待定元素    

        [right, n] 内的元素都是 2

        算法流程:
a. 初始化 cur = 0 left = -1 right = numsSize
b. cur < right 的时候(因为 right 表⽰的是 2 序列的左边界,因此当 cur 碰到right 的时候,说明已经将所有数据扫描完毕了),⼀直进⾏下⾯循环:根据 nums[cur] 的值,可以分为下⾯三种情况:
        i. nums[cur] == 0 ;说明此时这个位置的元素需要在 left + 1 的位置上,因此交换 left + 1 cur 位置的元素,并且让 left++ (指向 0 序列的右边界),cur++ (为什么可以 ++ 呢,是因为 left + 1 位置要么是 0 ,要么是 cur ,交换完毕之后,这个位置的值已经符合我们的要求,因此 cur++ 
        ii. nums[cur] == 1 ;说明这个位置应该在 left cur 之间,此时⽆需交换,直接让 cur++ ,判断下⼀个元素即可;
        iii. nums[cur] == 2 ;说明这个位置的元素应该在 right - 1 的位置,因此交换right - 1 与 cur 位置的元素,并且让 right-- (指向 2 序列的左边界),cur 不变(因为交换过来的数是没有被判断过的,因此需要在下轮循环中判断)
c. 当循环结束之后:
        [0, left] 表⽰ 0 序列;
        [left + 1, right - 1] 表⽰ 1 序列;
        [right, numsSize - 1] 表⽰ 2 序列。

        代码实现

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;
        }
        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];
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/427879.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

抖店入驻费用是多少?新手入驻都有哪些要求?2024费用明细!

我是电商珠珠 我做电商做了将近五年&#xff0c;做抖店做了三年多&#xff0c;期间还带着学员一起做店。 今天&#xff0c;就来给大家详细的讲一下在抖音开店&#xff0c;需要多少费用&#xff0c;最低需要投入多少。 1、营业执照200元左右 就拿个体店举例&#xff0c;在入…

二叉搜索树题目:将有序数组转换为二叉搜索树

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法证明代码复杂度分析 题目 标题和出处 标题&#xff1a;将有序数组转换为二叉搜索树 出处&#xff1a;108. 将有序数组转换为二叉搜索树 难度 4 级 题目描述 要求 给定整数数组 nums \texttt{nums}…

大辩论:人工智能时代人类和软件的未来

关于人工智能将在多大程度上接管软件开发、交付和支持任务及其对就业的影响&#xff0c;聆听双方的争论&#xff0c;对于技术来说既令人兴奋&#xff0c;又让人类感到恐惧。争论是这样的&#xff1a; 人工智能倡导者&#xff1a;欢迎来到未来&#xff01;凭借当今人工智能的能…

猫挑食不吃猫粮怎么办?可以解决猫咪挑食的主食冻干推荐

现在的猫奴们普遍将自家的小猫视为掌上明珠&#xff0c;宠爱有加。然而&#xff0c;这种宠爱有时也会导致猫咪养成一些不良习惯&#xff0c;比如挑食。猫挑食不吃猫粮怎么办&#xff1f;今天为大家分享一个既不让咱宝贝猫咪受罪又可以改善猫咪挑食的方法。 一、猫咪是为什么挑食…

(C语言)qsort函数详解

目录 1. qsort解释 2. qsort实例 2.1 qsort排列整形数组类型&#xff1a; 2.2 qsort排列结构体类型数据&#xff08;字符串&#xff09;&#xff1a; 2.3 qsort排列结构体类型数据&#xff08;整形&#xff09;&#xff1a; 1. qsort解释 我们可以进入网站&#xff1a;qso…

第一天 走进Docker的世界

第一天 走进Docker的世界 介绍docker的前世今生&#xff0c;了解docker的实现原理&#xff0c;以Django项目为例&#xff0c;带大家如何编写最佳的Dockerfile构建镜像。通过本章的学习&#xff0c;大家会知道docker的概念及基本操作&#xff0c;并学会构建自己的业务镜像&…

王者荣耀整蛊搭建直播新玩法/obs贴纸配置教程

最近很火的王者荣耀整蛊直播&#xff0c;相信很多玩王者的玩家也想开一个直播&#xff0c;但是看到这种直播娱乐效果很有意思也想搭建一个&#xff0c;这里梦哥给大家出了一期搭建的教程&#xff01; 进阶版视频教程&#xff1a; 这期的教程是进阶版新玩法升级&#xff0c;具体…

DataGrip 2023:让数据库开发变得更简单、更高效 mac/win

JetBrains DataGrip 2023是一款功能强大的数据库IDE&#xff0c;专为数据库开发和管理而设计。通过DataGrip&#xff0c;您可以连接到各种关系型数据库管理系统(RDBMS)&#xff0c;并使用其提供的一组工具来查询、管理、编辑和开发数据库。 DataGrip 2023软件获取 DataGrip 2…

前端面试 跨域理解

2 实现 2-1 JSONP 实现 2-2 nginx 配置 2-2 vue 开发中 webpack自带跨域 2 -3 下载CORS 插件 或 chrome浏览器配置跨域 2-4 通过iframe 如&#xff1a;aaa.com 中读取bbb.com的localStorage 1)在aaa.com的页面中&#xff0c;在页面中嵌入一个src为bbb.com的iframe&#x…

大模型理论基础(so-large-lm)课程笔记!

Datawhale干货 作者&#xff1a;辣条&#xff0c;Datawhale优秀学习者 前 言 在当前信息时代&#xff0c;大型语言模型&#xff08;Large Language Models&#xff0c;LLMs&#xff09;的发展速度和影响力日益显著。随着技术进步&#xff0c;我们见证了从基本的Transformer架构…

【三维重建】【SLAM】SplaTAM:基于3D高斯的密集RGB-D SLAM(CVPR 2024)

题目&#xff1a;SplaTAM: Splat, Track & Map 3D Gaussians for Dense RGB-D SLAM 地址&#xff1a;spla-tam.github.io 机构&#xff1a;CMU&#xff08;卡内基梅隆大学&#xff09;、MIT&#xff08;美国麻省理工&#xff09; 总结&#xff1a;SplaTAM&#xff0c;一个新…

在你的 Vue + Electron 项目里,引入 ESLint

因为我的项目是基于 Electron 平台的 Web 应用&#xff0c;使用 Vue 3 实现&#xff0c;而且用了 TypeScript&#xff0c;所以&#xff0c;在引入 ESLint 的时候&#xff0c;要考虑好几种规范的问题。 文章目录 零、简介1. 规则2. 配置文件3. 共享配置4. 插件5. 解析器6. 自定义…

【比较mybatis、lazy、sqltoy、mybatis-flex、easy-query操作数据】操作批量新增、分页查询(三)

orm框架使用性能比较 比较mybatis、lazy、sqltoy、mybatis-flex、easy-query操作数据 环境&#xff1a; idea jdk17 spring boot 3.0.7 mysql 8.0测试条件常规对象 orm 框架是否支持xml是否支持 Lambda对比版本mybatis☑️☑️3.5.4sqltoy☑️☑️5.2.98lazy✖️☑️1.2.4…

哪个有名的工具可以安全记事 私密记事本笔记推荐

在这个数字化的时代&#xff0c;我们的生活已经离不开各种记事工具。它们帮助我们记录生活中的点点滴滴&#xff0c;无论是工作上的重要事项&#xff0c;还是个人的私密心情。然而&#xff0c;当我在寻找一个能够安心记录私密事情的工具时&#xff0c;安全性成为了我最关心的因…

23.基于springboot + vue实现的前后端分离-在线旅游网站系统(项目 + 论文PPT)

项目介绍 本旅游网站系统采用的数据库是MYSQL &#xff0c;使用 JSP 技术开发&#xff0c;在设计过程中&#xff0c;充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面简洁等特点。 技术选型 后端: SpringBoot Mybatis 数据库 : MyS…

Matlab 机器人工具箱 动力学

文章目录 R.dynR.fdynR.accelR.rneR.gravloadR.inertiaR.coriolisR.payload参考链接 官网&#xff1a;Robotics Toolbox - Peter Corke R.dyn 查看动力学参数 mdl_puma560; p560.dyn;%查看puma560机械臂所有连杆的动力学参数 p560.dyn(2);%查看puma560机械臂第二连杆的动力学…

MongoDB Java实战

&#x1f4d5;作者简介&#xff1a; 过去日记&#xff0c;致力于Java、GoLang,Rust等多种编程语言&#xff0c;热爱技术&#xff0c;喜欢游戏的博主。 &#x1f4d7;本文收录于MongoDB系列&#xff0c;大家有兴趣的可以看一看 &#x1f4d8;相关专栏Rust初阶教程、go语言基础…

SpringBoot+Vue实现el-table表头筛选排序(附源码)

&#x1f468;‍&#x1f4bb;作者简介&#xff1a;在笑大学牲 &#x1f39f;️个人主页&#xff1a;无所谓^_^ ps&#xff1a;点赞是免费的&#xff0c;却可以让写博客的作者开心好几天&#x1f60e; 前言 后台系统对table组件的需求是最常见的&#xff0c;不过element-ui的el…

机器学习-面经(part2)

3. 验证方式 3.1什么是过拟合?产生过拟合原因? 定义:指模型在训练集上的效果很好,在测试集上的预测效果很差 数据有噪声 训练数据不足,有限的训练数据 训练模型过度导致模型非常复杂3.2 如何避免过拟合问题? 3.3 什么是机器学习的欠拟合?产生原…

vmware扩容CentOS磁盘的两种方案

vmware扩容CentOS磁盘的两种方案 扩容磁盘的两种需求 扩容磁盘&#xff0c;一种情况&#xff0c;我们希望见原来不足的存储无缝伸缩扩容&#xff0c;通常是给原本的根目录/扩容&#xff0c;另一种是在另一个目录上挂载新磁盘。 本次记录第一种情况&#xff0c;主要参考https…
最新文章