【基础算法总结】模拟算法

模拟算法

  • 1.替换所有的问号
  • 2.提莫攻击
  • 3.Z 字形变换
  • 4.外观数列
  • 5.数青蛙

在这里插入图片描述

点赞👍👍收藏🌟🌟关注💖💖
你的支持是对我最大的鼓励,我们一起努力吧!😃😃

模拟算法 —> 比葫芦画瓢
在模拟这一类题里面,题目已经告诉了这些题应该怎么做,所有我们接下来做的是把题目中的过程转换成代码解决这个问题。

这个算法特点:思路比较简单,考察的是代码能力。
这就决定了,

  1. 一定要模拟算法流程(一定要在演草纸上过一遍流程,注意细节!)
  2. 把流程转化成代码

1.替换所有的问号

题目链接:1576. 替换所有的问号

题目描述:

在这里插入图片描述
在这里插入图片描述
算法原理:
在这里插入图片描述

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.提莫攻击

题目链接:495. 提莫攻击

题目分析:

在这里插入图片描述
当在t秒中毒,持续时间为 [t,t+duration-1]
在这里插入图片描述
算法原理:

首先我们发现一个规律
在这里插入图片描述

在这里插入图片描述

class Solution {
public:int findPoisonedDuration(vector<int>& timeSeries, int duration) {int ret=0;for(int i=1;i<timeSeries.size();++i){int x=timeSeries[i]-timeSeries[i-1];if(x>=duration) ret+=duration;else ret+=x;}return ret+duration;//最后一次中毒时间也要加上}
};

3.Z 字形变换

题目链接:6. Z 字形变换

题目分析:

在这里插入图片描述
给你一个字符串,它按照Z字形排列后,然后从左往右输出按照N字形排列之后的字符串。

在这里插入图片描述
算法原理:

解法一:模拟

题目要求怎么做就模拟一下,首先开辟一个n行,然后字符串长度的列的二维数组。这样能保证把所有字符都能放进去。

但是时间复杂度和空间复杂度都是O(len*n)
在这里插入图片描述
想一想能不能进行优化。

模拟题的优化方式都是在模拟的基础上找规律

解法二:找规律

上面是把字符填到数组里,现在我把下标填进去
在这里插入图片描述
第一行从0跳到6然后在跳到12,我们发现它的间隔是一样的,这里的间隔公差设为d,d=6。也就是说我们直接把下标0位置弄完,然后在找下标6的位置等等,就可以把第一行字符全部找完,就不用在弄一个数组然后把字符填上去了。

公差d应该怎么计算呢,我们发现 d=2*n-2

最后一行从下标n-1开始,n-1+d,n-1+2d,下标一定是要小于字符串长度的。

在这里插入图片描述

第一行和最后一行我们解决了,剩下就是中间行了

我们发现中间行公差其实也是6,但是如果一个一个算比如1+6=7,7+6=13,然后还要回头在来算5+6=11。我们其实可以两个下标一起计算
在这里插入图片描述

上面d=2*n-2有可能不是所有情况都适应,我们再举个例子
发现这个公差公式也是正确的。
在这里插入图片描述

但是一定要注意n=1的情况,那就只有一行,如果按照上面找的规律就会死循环,此时原本的字符串就是最终答案,因此特殊处理一下

class Solution {
public:string convert(string s, int numRows) {//处理边界if(numRows == 1) return s;string ret;int d=2*numRows-2,n=s.size();// 1.先处理第一行for(int i=0;i<n;i+=d)ret+=s[i];// 2.处理中间行for(int i=1;i<numRows-1;++i)//枚举每一行{for(int j=i,k=d-i;j<n ||k<n;j+=d,k+=d){if(j<n) ret+=s[j];if(k<n) ret+=s[k];}}// 3.处理最后一行for(int i=numRows-1;i<n;i+=d)ret+=s[i];return ret;}
};

4.外观数列

题目链接:38. 外观数列

题目分析:

在这里插入图片描述
这道题具体意思是,给你一个n返回到n的时候这个数的变化。

在这里插入图片描述

算法原理:

解法:模拟+双指针

在这里插入图片描述

class Solution {
public:string countAndSay(int n) {string ret="1";for(int i=1;i<n;++i){int left=0,right=0;string tmp;while(right<=ret.size()){if(ret[right] != ret[left]){tmp+=to_string(right-left);tmp+=ret[left];left=right;}++right;}ret=tmp;}return ret;}
};

5.数青蛙

题目链接:1419. 数青蛙

题目分析:

在这里插入图片描述

给一个字符串,这个字符串是蛙鸣的组合,让找到这个字符串中蛙鸣所需最少青蛙的个数。
在这里插入图片描述

算法原理:

解法:模拟

如果从前往后找蛙鸣太难了,情况太复杂。
在这里插入图片描述
我们可以考虑如果到r前面一定要有c,到o前面一定要有r等等,我们要找一个字符的前缀。判断字符串在不在我们一般用哈希表

下面是三种情况

在这里插入图片描述
总结一下:
r,o,a,k
找一下前驱字符,是否在哈希表中存在

  1. 存在:前缀个数- -,当前字符++
  2. 不存在:返回-1

c 找最后一个字符,是否在哈希表中存在
3. 存在:最后一个字符- -,当前字符++
4. 不存在:当前字符++

class Solution {
public:int minNumberOfFrogs(string croakOfFrogs) {string str="croak";int n=str.size();vector<int> hash(n); //用数组来模拟哈希表unordered_map<char,int> index; //[x,x这个字符的下标]for(int i=0;i<n;++i)index[str[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.mzph.cn/news/846192.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python魔法之旅-魔法方法(10)

目录 一、概述 1、定义 2、作用 二、应用场景 1、构造和析构 2、操作符重载 3、字符串和表示 4、容器管理 5、可调用对象 6、上下文管理 7、属性访问和描述符 8、迭代器和生成器 9、数值类型 10、复制和序列化 11、自定义元类行为 12、自定义类行为 13、类型检…

07.与jenkins集成实现cicd

7.与jenkins集成实现ci/cd ip地址服务内存192.168.111.11kube-apiserver 80801G192.168.111.13k8s-node22G192.168.111.14jenkins(tomcat jdk) 8080 kubelet docker1G192.168.111.15gitlab 8080,80 docker2G 通过jenkins一键操作实现发布服务&#xff0c;jenkins对接k8s …

简单的小波自编码器降噪(Python)

代码很简单&#xff0c;很容易读懂。 import kerasfrom keras import layersfrom keras.datasets import mnistimport numpy as npimport matplotlib.pyplot as pltimport pywtimport tensorflow as tfimport torch#加载经典的mnist手写数字图像(x_train, _), (x_test, _) mn…

基于Chisel的FPGA流水灯设计

Chisel流水灯 一、Chisel&#xff08;一&#xff09;什么是Chisel&#xff08;二&#xff09;Chisel能做什么&#xff08;三&#xff09;Chisel的使用&#xff08;四&#xff09;Chisel的优缺点1.优点2.缺点 二、流水灯设计 一、Chisel &#xff08;一&#xff09;什么是Chise…

uniapp 怎么设置凸起的底部tabbar

1. uniapp 怎么设置凸起的底部tabbar 1.1. 方案一系统提供 1.1.1. 使用uniapp官方提供的属性midButton 使用时&#xff0c;list数组须为偶数 &#xff08;1&#xff09;pages.json "tabBar": {"custom": true,"color": "#8F8F94",&q…

HTML的标签(标题、段落、文本、图片、列表)

HTML的标签1 标题标签&#xff1a;段落标签&#xff1a;文本标签&#xff1a;图片标签:列表标签&#xff1a;有序列表&#xff1a;无序列表&#xff1a;定义列表&#xff1a;列表案例&#xff1a; 标题标签&#xff1a; 标签&#xff1a;h1~h6 注意&#xff1a;如果使用无效标…

【安规介绍】

文章目录 一、基础知识安规上的六类危险的防护&#xff1a;安全电压漏电流接触电流能量问题&#xff1a;火灾问题&#xff1a;热问题结构问题阻燃等级绝缘等级&#xff1a;对接地系统的要求&#xff1a;结构要求:电气要求&#xff1a; 二、设计的关键电气绝缘距离电气爬电距离:…

Python知识点14---被规定的资源

提前说一点&#xff1a;如果你是专注于Python开发&#xff0c;那么本系列知识点只是带你入个门再详细的开发点就要去看其他资料了&#xff0c;而如果你和作者一样只是操作其他技术的Python API那就足够了。 在Python中被规定的东西不止有常识中的那些关键字、构造器等编程语言…

乡村振兴与农村环境整治:加强农村环境治理,改善农村人居环境,打造干净整洁、生态宜居的美丽乡村

目录 一、引言 二、农村环境整治的重要性 1、提升农民生活质量 2、促进农村经济发展 3、保护农村生态环境 三、当前农村环境面临的问题 1、垃圾处理不当 2、污水处理设施缺乏 3、农业面源污染严重 四、加强农村环境治理的措施 1、完善农村垃圾处理体系 2、加强农村…

14.Ollydbg的基本使用

上一个内容&#xff1a;13.优化界面化的游戏辅助 Ollydbg是一个调试工具&#xff0c;它可以一步一步的运行一个程序并且还能很直观的看到被调试程序的寄存器状态、栈状态。Ollydbg需要以管理员方式运行&#xff01; 下图附加程序是调试一个正在运行的进程&#xff1a; 点击了…

文章解读与仿真程序复现思路——电力系统自动化EI\CSCD\北大核心《考虑动态定价的新能源汽车能源站优化运行》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

Nacos-SpringBoot-配置中心

Nacos配置中心 前情回顾 上一章呢 了解并且学习了Nacos服务注册与发现 在一系列破防中走了出来Nacos服务注册完成https://blog.csdn.net/m0_68711597/article/details/139265244?spm1001.2014.3001.5502 本以为接下来会一帆风顺 一马平川 没想刚出坑 又入坑 Nacos的配置…

Prime1 - 信息收集和分析能力的试炼

主机发现 nmap扫描与分析 端口22、80 详细扫描&#xff1b;linux、ubuntu、 udp扫描 端口都是关闭的 脚本扫描 web渗透 打开只有一张图片&#xff1b;源码有图片和一个alt&#xff1a;hnp security不知道有啥用&#xff0c;先记录下来吧 继续web渗透思路走吧&#xff0c;目录…

[Python]用Qt6和Pillow实现截图小工具

本文章主要讲述的内容是&#xff0c;使用python语言借助PyQt6和Pillow库进行简单截图工具的开发&#xff0c;含义一个简单的范围裁剪和软件界面。 主要解决的问题是&#xff0c;在高DPI显示屏下&#xff0c;坐标点的偏差导致QWidget显示图片不全、剪裁范围偏差问题。 适合有一点…

vivado BD_ADDR_SEG

按字母顺序排列的一类对象列表 BD_ADDR_SEG 描述 地址段或bd_addr_seg对象描述一个范围的位置和大小记忆力它们有一个范围&#xff08;大小&#xff09;和一个可选的起始偏移。对于各种内存映射的主接口和从接口&#xff0c;IP集成商遵循行业用于捕获存储器要求和能力的标准IP-…

数据库与缓存⼀致性⽅案

数据库与缓存⼀致性⽅案 1、背景2、数据⼀致性⽅案设计3、数据⼀致性⽅案流程图4、关键代码4.1、 处理数据⼀致性的消息队列⼊⼝4.2、数据⼀致性配置的常量信息 1、背景 现有的业务场景下&#xff0c;都会涉及到数据库以及缓存双写的问题&#xff0c;⽆论是先删除缓存&#xf…

【移动端】商场项目路由设计

1&#xff1a;路由设计配置&#xff1a; 一级路由配置 分析项目&#xff0c;设计路由&#xff0c;配置一级路由 一级路由&#xff1a;单个页面独立展示的&#xff0c;都是一级路由&#xff0c;例如&#xff1a;登录页面&#xff0c;首页架子&#xff0c;报错页面 二级路由&…

美业SaaS收银系统源码-已过期卡项需要延期怎么操作?美业系统实操

美业SaaS系统 连锁多门店美业收银系统源码 多门店管理 / 会员管理 / 预约管理 / 排班管理 / 商品管理 / 促销活动 PC管理后台、手机APP、iPad APP、微信小程序 1.询问会员手机号和需要延期的卡项 2.PC运营后端-数据导入-修改已售卡项&#xff0c;搜索手机号 3.把需要卡项选…

深入分析 Android BroadcastReceiver (一)

文章目录 深入分析 Android BroadcastReceiver (一)1. Android BroadcastReceiver 设计说明1.1 BroadcastReceiver 的主要用途 2. BroadcastReceiver 的工作机制2.1 注册 BroadcastReceiver2.1.1 静态注册2.1.2 动态注册 3. BroadcastReceiver 的生命周期4. 实现和使用 Broadca…

C++ | Leetcode C++题解之第125题验证回文串

题目&#xff1a; 题解&#xff1a; class Solution { public:bool isPalindrome(string s) {int n s.size();int left 0, right n - 1;while (left < right) {while (left < right && !isalnum(s[left])) {left;}while (left < right && !isalnu…