专题六_模拟_算法详细总结
目录
模拟算法
1.模拟算法流程(一定要在草稿纸上演算一遍流程)
2.把流程转换成代码
1. 替换所有的问号(easy)
解析:
1.暴力:
2.优化:(找规律)
总结:
2. 提莫攻击(easy)
解析:
1.暴力:
2.优化:
3. N 字形变换(medium)
解析:
1)暴力:
2)优化:
总结:
4. 外观数列 (medium)
解析:
1)暴力:
2)优化(小demo):
总结:
5. 数⻘蛙(medium)
解析:
1)暴力:
2)优化:
总结:
模拟算法
特点就是思路比较简单,特别考验的是如何把里路转换成代码的能力。
1.模拟算法流程(一定要在草稿纸上演算一遍流程)
2.把流程转换成代码
相对来说,模拟题读题就知道是跟着题目的意思一步一步走,但是但凡觉得只是暴力求解时间复杂度和空间复杂度太高了,那么就要转换思想去找规律。模拟题的优化,就是不断的找规律。
1. 替换所有的问号(easy)

解析:
1.暴力:
我开始第一次做的时候,就是创建了心得字符串str,然后每次再遇到不是'?' 的时候就加入,是就改变这个字符,但是在这之前为了保证字符不连续重复,我就用a和b来分别定义字符串中没有出现过的字符,然后用下标奇偶的关系就可以保证a,b交错不连续重复。
class Solution {
public:string modifyString(string _s) {string s;unordered_map<char,int> hash;for(auto e : _s) if(e!='?') hash[e]++;char a='a',b='a';while(hash[a]) a++; hash[a]++;while(hash[b]) b++;int i=1;for(auto e : _s){if(e!='?') s+=e;else{if(i%2==0) s+=a;else s+=b;}i++;}return s;}
};
2.优化:(找规律)
线性时间复杂度,而且空间复杂度为O(1),只在原来的字符串s上进行修改,那么时间复杂度很低O(N),只需要早原串的基础上进行修改就行。
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||ch!=s[i-1])&&(i==n-1||ch!=s[i+1])){s[i]=ch;break;}}}}return s;}
};
总结:
像这种模拟题,就要尽可能的想到简便的办法来进行优化,其实很简单。
2. 提莫攻击(easy)
这题题意很简单,就是再中毒时间内,如果继续被攻击,那么就刷新中毒时间,从头开始,那么只需要计算数组每两个数之间的间隙大小是否大于中毒时间即可。

解析:
1.暴力:
想暴力,就是求出每个时间间隔然后再与中毒时间进行比较,小于中毒时间的就只加上这个间隙,否者就加上完整的中毒时间。
2.优化:
根据题目意思就是要看判断再你的下一次攻击时,对方是否再中毒期间,如果是,那么就要进行重置,就只要加上从上一次中毒到这次中毒的间隙,若这个间隙大于或等于中毒时间,那么就只能加上这个中毒时间即可,最后遍历完整个数组后就再加上最后一次的中毒时长就是最后的结果,其实跟暴力没啥区别。
class Solution {
public:int findPoisonedDuration(vector<int>& timeSeries, int duration) {int ret=0;int n=timeSeries.size();for(int i=0;i<n-1;i++){int a=timeSeries[i+1]-timeSeries[i];if(a>=duration) ret+=duration;else ret+=a;}return ret+duration;}
};
3. N 字形变换(medium)

解析:
1)暴力:
暴力肯定最开始想到就是按照字符串的下标顺序来进行存入二维数组里面,比如:这个字符串按照下标开始存入二维数组的第一列然后再开始斜边存入,再存入第二列,再次斜边存入等接下来存完整个二维数组,时间复杂度和空间复杂度都达到O(N^2),但是这题数据量小,可以试试,还是能过的,但是这种办法,我想这就头疼。必须要优化一下
2)优化:
那么说是优化,其实就是找规律,模拟,现根据题目意思进行模拟运算,比如创建一个二维数组来分别进行填入字符串的每一位,但是这一不管是时间复杂度还是空间复杂度都是O(N^2)都太过于复杂
那么就要对他进行优化,对于模拟题,优化都是采用找规律的形式,
1)首先看第一行,每两个数字之间都是由一个公差来决定的,那么就要想办法求出公差,公差就是两倍的行数减去2,或者,就是(二维矩阵行数-1)*2得到公差
2)那么最后一行同样是由一个公差来得到。
3)那么其间的k行[1,n-1]行就都是由两个数,来分别+公差d来组成的,第一个数就是k行的首元素,第二个数就是 d-k 为下标的元素

class Solution {
public:string convert(string s, int numRows) {int n=s.size();if(numRows==1) return s;string ret;//第一行//求公差int d=numRows*2-2;int prelude=0;while(prelude<n) ret+=s[prelude],prelude+=d;//中间行for(int k=1;k<=numRows-2;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];}}//最后一行int k=numRows-1;while(k<n) ret+=s[k],k+=d;return ret;}
};
总结:
对于这种题目有点复杂的模拟,就一定要耐心找到规律,就会变得很简单,重点就是如何把规律变成代码的形式。
4. 外观数列 (medium)

解析:
1)暴力:
暴力下就是不停的求出每一个次数条件下的字符串,其实优化也大差不差,都是再while里进行。
2)优化(小demo):
就是要再while外面记录s,每次循环一次们都要记录s,最后返回s。再就是在while里面,要记住每次循环完都要swap(ret,str) ,这样能保证ret每次都是要更新的新字符串,str每次都是上一次的字符串。
模拟这个字符串生成的规律,设置三个字符串,每次都更新str,用双指针left和right来记录重复的字符,并更新到ret里面,然后每次当right走到结尾时候,就把ret赋值给s,并且交换ret跟str,来达到再次更新的目的,最后返回s即可。
class Solution {
public:string countAndSay(int _n) {string ret;string str=to_string(1);if(_n==1) return str;string s;while(--_n){int n=str.size();for(int left=0,right=0;right<n;right++){if(str[left]!=str[right]){ret+=to_string(right-left);ret+=str[left];left=right;}if(right==n-1){ret+=to_string(right-left+1);ret+=str[left];}}s=ret;swap(str,ret);ret.clear();}return s;}
};
总结:
有些比较简单的模拟,真的一眼就能只知道怎么写,可能这就是提升吧。
5. 数⻘蛙(medium)

解析:
1)暴力:
这题如果想不上优化,那还真有点暴力,5个else if() 来判断条件,判断前面是否有字符存在满足条件是我当前字符的前一个,如果是就继续,不是就直接返回-1
2)优化:
首先就是解决5个else if()的问题,可以用一个unordered_map<char,int> index;来将字符串装起来,将字符串的字符与下标进行映射,然后创建一个hash表,这个hash表专门装入五个字符“蛙叫”
hash表,来记录最少青蛙的只数。
eg:
我现在读到的字符是ch=‘o’,那么我就要判断前面的字符‘r’是否存在过,如果现在存在,就证明这一只青蛙可以喊道我这个‘o’,否则就说明是错误的,返回-1

又比如:我已经有青蛙喊完了一遍,又碰到一个字符是ch,此时我的hash['k']==1,就说明有一次青蛙已经喊完了,但是,有碰到ch=='c' ,又要从头开始叫,那么就可以让这只已经叫过的青蛙重叫,就不会增加青蛙只数。

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];}
};
总结:
主要优化就是要找到其中的规律,可以很暴力的求解,但是这样往往都十分消耗精力,可以多想一步,说不定就解决了多次else if()的问题。这个算法里面,用index将字符跟下标进行对应,很完美的解决了else if()来判断每次读到哪个字符,这个位置是否要加减的问题。
总结一下吧~模拟题相对来说确实比较轻松,只要读懂题意跟着题目一步步走一般问题不大,还是那句话,熟能生巧,本章节对我有很大促进作用,希望对你有用!!
相关文章:
专题六_模拟_算法详细总结
目录 模拟算法 1.模拟算法流程(一定要在草稿纸上演算一遍流程) 2.把流程转换成代码 1. 替换所有的问号(easy) 解析: 1.暴力: 2.优化:(找规律) 总结: …...
ArrayList的扩容机制
ArrayList的扩容机制 ArrayList中的成员变量:1.不带参数的构造方法 让elementDate 引用指向 DEFAULTCAPACITY_EMPTY_ELEMENTDATA所指向的对象 > 当我们调用 不带参数的构造方法的时候 第一次进行add元素的时候,会为底层的数组 进行内存的分配&…...
一、编译原理(引论)
目录 【一】、引论 一、编译器 1、编译器 2、编译器与解释器 3、编译器结构 【一】、引论 一、编译器 1、编译器 (1)编译器:将人类易懂的 高级语言 翻译成 硬件可执行的目标机器语言 (2) 高级语言 ⚫ 直接面…...
【Javascript修炼篇】JS中的函数式编程
介绍: 函数式编程(FP)是一种编程范式,这意味着一种基于一些原则来思考软件构建的方法,比如 纯函数、不可变性、一等与高阶函数、函数组合、闭包、声明式编程、递归、引用透明性、柯里化 和 部分应用。 当这些原则有效…...
spring cxf 常用注解
在Spring框架中,特别是当与Apache CXF(一个流行的SOAP和RESTful Web服务框架)结合使用时,我们会遇到一系列的注解。以下是一些在Spring和CXF中常用的注解: Spring相关注解: Component:用于定义一…...
python | x-y 网格切片
写在前面 通常, 我们处理的毕竟完善的nc产品,一般呈现未timexlatxlon的维度,且lon和lat都是规则的网格,我们可以方便的使用xarray.sel()选择合适的区域进行切片。但是,部分nc产品比如卫星轨道或者模式输出的数据&…...
【C#】vs2022 .net8
Visual Studio 2022 IDE - 适用于软件开发人员的编程工具 (microsoft.com) 更新就会出现...
【华为杯】第二十一届中国研究生数学建模竞赛
“华为杯”第二十一届中国研究生数学建模竞赛即将开始,梦想科研社给大家整理一些比赛信息,在正式开赛后,我们也会持续分享一些课题的分析以及代码,有需要的可以联系我们获取资料信息哦 一、时间节点 1.加密赛题开始下载时间&…...
首次开机android.intent.action.BOOT_COMPLETED开机广播发送慢的问题
1. 背景 做过android开发的同学相信一定做个这种逻辑:app接收BOOT_COMPLETED开机广播,自启动,或者收到广播做一些事情。目前在我们的项目上遇到首次开机,BOOT_COMPLETED开机广播发送慢的问题。接下来分享记录下如何定位这类问题。 2. 分析过…...
通信工程学习:什么是OLT光线路终端
OLT:光线路终端 OLT(Optical Line Terminal,光线路终端)是光纤通信系统中的核心局端设备,特别是在无源光网络(Passive Optical Network, PON)架构中扮演着至关重要的角色。以下是关于OLT光线路终…...
Unity的Button组件进行扩展
废话不多说,在Untiy中,如果想要对Button等组件进行扩展的话,那么不仅仅只需要将新增的属性设置为public或者增加SerializeField字段就行了的,同时需要对Inspector的GUI面板进行修改,以下直接展示代码: usi…...
前端vue-插值表达式和v-html的区别
创建vue实例的时候,可以有两种形式。 1.let appnew Vue({}) 2 const appnew Vue({}) 3 el是挂载点,是上面div的id值 4 data中的值可以展示在上面div中 5 v-html标签里面如果有内容,则我们的新内容会把标签里面的内容覆盖掉...
【开发心得】筑梦上海:项目风云录(4)
不知不觉已经写到了第4篇,天下大事,必作于细。 其实项目管理也是如此,成功都在细节之处。自从博士离开以后,项目逐步开始进入了正常轨道。来来回回的30多人,也不能一一列举的记流水账。 目录 会海和MSN 小娇往事 …...
el-table使用el-switch选择器没效果
出现问题的代码: 0表示启用,1表示禁用,发现页面根本没有效果,百思不得其解,查阅资料,恍然大悟。 <el-table :data"userList" stripe border style"width: 100%" height"500"><…...
libserailport交叉编译适配说明
1:libserialport简介 github路径 自己的gitee路径 libserialport 是一个跨平台的串口通信库,由 sigrok 项目开发。它简洁、易用,并且支持多种操作系统。 libserialport 支持阻塞和非阻塞模式,可以根据你的需求选择适当的模式。阻…...
C语言中的一些小知识(二)
一、"%"运算符两侧只能是整数 在C语言中,% 运算符称为模运算符或取余运算符,它用于计算两个整数相除后的余数。当使用 % 运算符时,操作数必须是整数类型(包括 char、int、long 等)。 语法 remainder div…...
使用 Go 语言实现简单聊天系统
在互联网时代,聊天系统是常见的应用场景之一。无论是即时通讯、在线客服还是多人游戏中的消息系统,聊天功能的实现都是必不可少的。本文将使用 Go 语言,结合 WebSocket 来构建一个简单的多人聊天室系统。 一、项目结构 首先,我们…...
用友U8二次开发工具KK-FULL-*****-EFWeb使用方法
1、安装: 下一步,下一步即可。弹出黑框不要关闭,让其自动执行并关闭。 2、服务配置: 输入服务器IP地址,选择U8数据源,输入U8用户名及账号,U8登录日期勾选系统日期。测试参数有效性,提示测试通过…...
【经验帖】脏读和不可重复读的概念及影响
脏读和不可重复读是数据库事务并发执行时可能出现的两种数据一致性问题,它们对数据的一致性和完整性有着显著的影响。以下是脏读和不可重复读的具体影响: 脏读的影响 脏读发生在一个事务读取了另一个事务未提交的数据时。由于这些数据尚未被提交&#x…...
MTK zephyr平台:USB升级、枚举流程
一、USB升级流程 通过代码及log分析,当前平台升级过程在PL阶段进行 USB download相关代码 mtk/modules/hal/boot/preloader/platform/flashc/ mtk/modules/hal/boot/preloader/platform/board_name/flash/ mtk/modules/hal/boot/preloader/platform/board_name/src/drive…...
OpenClaw调试技巧:Gemma-3-12b-it任务失败的根本原因分析
OpenClaw调试技巧:Gemma-3-12b-it任务失败的根本原因分析 1. 问题背景与现象描述 上周我在本地部署了Gemma-3-12b-it模型,准备用OpenClaw实现自动化周报生成。结果连续三次任务都在"分析本周工作内容"环节卡住,控制台只显示Task …...
OpenClaw浏览器自动化:Qwen3-14b_int4_awq驱动网页检索与数据抓取
OpenClaw浏览器自动化:Qwen3-14b_int4_awq驱动网页检索与数据抓取 1. 为什么需要浏览器自动化助手 作为一个经常需要收集行业动态的技术博主,我每天要花大量时间在不同网站间切换、搜索关键词、复制粘贴数据。这种重复劳动不仅效率低下,还容…...
Lansium-Arduino:面向物联网终端的轻量级MQTT通信库
1. 项目概述 Lansium-Arduino 是一个面向嵌入式物联网终端的轻量级通信库,专为 Arduino 生态(含 ESP32、ESP8266、Arduino Uno Ethernet/WiFi 扩展板等平台)设计,用于实现设备与 Lansium Server 的可靠双向连接。其核心通信协议…...
51单片机入门难点解析与高效学习路径
1. 为什么51单片机入门难?问题出在哪里?很多初学者在接触51单片机时,都会遇到一个奇怪的现象:明明大家都说51单片机简单,但自己学起来却特别吃力。作为一个带过上百名单片机新手的工程师,我发现这个问题通常…...
Bugtton:ATmega328P专用超低开销按钮消抖库
1. 项目概述Bugtton 是一款专为 ATmega328P 微控制器深度优化的轻量级按钮消抖库,其设计哲学直指嵌入式系统中一个被长期忽视却至关重要的性能瓶颈:空闲状态下的 CPU 周期开销。在传统 Arduino 风格的按钮处理方案中,digitalRead()函数因其通…...
x86汇编如何使用伪指令实现if,else,while,dowhile,switch-case
x86汇编如何使用伪指令实现if,else,while,dowhile,switch-case 1)汇编伪指令介绍 伪指令是汇编器提供的语法规则,它主要为程序员提供语法糖简化汇编代码的编写。常见的伪指令包括条件汇编类(IF&…...
毕业党速看:这款 AI 论文神器太疯狂,输入标题直接生成万字长文
赶 due 党、论文特困生直接狂喜!谁懂啊家人们,以前写论文从选题到憋出万字初稿,至少得熬半个月,现在输入一个论文标题,短短 20 分钟就能自动生成结构完整、逻辑通顺、带真实参考文献的万字长文,从摘要、引言…...
如何彻底关闭Elasticsearch 7.x的安全警告提示(内网开发必备)
彻底关闭Elasticsearch 7.x安全警告的实战指南 每次启动Elasticsearch时,控制台不断刷新的安全警告是否让你感到烦躁?特别是在内网开发环境中,这些红色警告既不影响功能又无法忽略。本文将带你深入理解警告产生的机制,并提供三种不…...
失业期PHP程序员极致利用时间的庖丁解
"失业期 PHP 程序员极致利用时间”,常被误解为“疯狂投简历”或“没日没夜地刷 LeetCode”。 但本质上,这是一场**“认知重构”与“资产增值”的特种战役**。 失业不是“空窗期”,而是上帝强行塞给你的**“全脱产战略转型期”**。 在在职…...
深入解析STM32F103的USB Mass Storage实现:SCSI命令实战指南
1. USB Mass Storage基础概念与STM32F103适配 在嵌入式系统开发中,实现USB Mass Storage功能是让设备被识别为U盘的关键技术。STM32F103系列作为经典的Cortex-M3内核微控制器,其内置的USB外设为这一功能提供了硬件基础。这里有个常见的误解:很…...
