算法之模拟

 前言

模拟算法通俗地来解释就是 "照葫芦画瓢", 通常这类题的题目中就说明了这道题应该怎么做, 要做的就是把题目的意思转化为代码, 这类题的特点是思路比较简单, 考查的是代码能力.

1. 模拟算法流程, 最好在演草纸上过一遍流程, 凭空想象可能会忽略一些细节

2. 把流程转化为代码


题目1: 替换所有的问号(easy)

 从前往后遍历字符串, 遇到 '?' 就替换为 a~z 中符合题意的字母, 也就是每次替换需要和前后的字符进行比较判断是否符合题意, 注意开头和结尾位置的字母判断.

class Solution {
public:string modifyString(string s) {for(int i = 0; i < s.length(); i++){if(s[i] == '?'){char c = 'a';s[i] = c;//默认都替换为a, 如果和前面字母相等或者和后面字母相等就换字母while((i>=1 && s[i] == s[i-1]) || (i <= s.length()-1 && s[i] == s[i+1]))s[i] = ++c;}}return s;}
};

题目2: 提莫攻击(easy)

此题问题关键在于判断 相邻两次攻击的时间间隔duration 的大小关系:

1. 如果是最后一次攻击, 直接加上duration即可.

2. 普通情况需要单独判断, 如果时间间隔>=duration, 直接+=duratio; 如果时间间隔<duration, += 时间间隔.

class Solution {
public:int findPoisonedDuration(vector<int>& timeSeries, int duration) {int ret = 0;int n = timeSeries.size();for(int i = 0; i < n; i++){if(i == n-1){ret += duration;break;}int gap = timeSeries[i+1] - timeSeries[i];if(gap >= duration)ret += duration;elseret += gap; }return ret;}
};

题目3: N 字形变换(medium)

可以通过找规律来优化, 第1行和第n-1行发现每两个元素间距是固定的, 设为d, d=2*n-2

第k行则多了两个元素, 下标分别为 k 和 d-k, 每两个元素间距依然是d: 

class Solution {
public:string convert(string s, int numRows) {vector<vector<char>> arr(numRows);int d = 2*numRows-2;int n = s.size();//n=1的时候, d=0, 直接返回原字符串即可, 否则死循环if(d == 0)return s;for(int i = 0; i < numRows; i++){//处理第一行if(i == 0)for(int j = i; j < n; j+=d)arr[i].push_back(s[j]);//处理第k行else if(i == numRows-1)for(int j = i; j < n; j+=d)arr[i].push_back(s[j]);//处理第k行else{for(int j = i, k = d-j; j < n; j+=d,k+=d){arr[i].push_back(s[j]);if(k < n) arr[i].push_back(s[k]);}}}string ret;for(const auto& v:arr)for(const auto& c:v)ret+=c;return ret;}
};

题目4: 外观数列

利用双指针记录 被描述字符它的长度, 然后依次描述即可:

class Solution {
public:string countAndSay(int n) {string ret = "1";//描述n-1即可for(int i = 1; i < n; i++){string tmp;int n = ret.size();int left = 0, right = 0;while(right < n){while(right < n && ret[right] == ret[left])right++;tmp += to_string(right-left) + ret[left];//添加描述的字符left = right;//更新left}            ret = tmp;}return ret;}
};

题目5: 数青蛙

 从前往后遍历crokaOFFrogs字符串, 如果遇到 'c' 说明有一个青蛙开始叫, 如果遇到  'r' 只需去查找前面的字符串中是否有 'c', 所以可以用哈希表来存储字符出现的次数, 也就是青蛙的个数, 遍历到 'r' 的时候, c字符出现个数>=1, 说明有青蛙可以叫出来'r', hash['c']--, hash['r']++, 代表有一个青蛙叫到 'r', 其它字符也是同理. 叫到'k'说明青蛙叫完了.

注意:

1. 我们寻找的是最小青蛙的个数, 如果hash['k']>=1, 说明有青蛙叫完了, 再遇到'c'的时候可以让叫完的青蛙去叫, 所以hash['k']--, hash['c']++

2. 如果字符串遍历结束k之前的字符有>=1的情况, 说明有青蛙没叫完, 返回-1

if else 写法: 

class Solution {
public:int minNumberOfFrogs(string croakOfFrogs) {unordered_map<char,int> hash;int n = croakOfFrogs.size();for(int i = 0; i < n; i++){if(croakOfFrogs[i] == 'c'){if(hash['k'])hash['k']--;hash['c']++;}else if(croakOfFrogs[i] == 'r'){if(hash['c']){hash['c']--;hash['r']++;}elsereturn -1;}else if(croakOfFrogs[i] == 'o'){if(hash['r']){hash['r']--;hash['o']++;}elsereturn -1;}else if(croakOfFrogs[i] == 'a'){if(hash['o']){hash['o']--;hash['a']++;}elsereturn -1;}else if(croakOfFrogs[i] == 'k'){if(hash['a']){hash['a']--;hash['k']++;}elsereturn -1;}elsereturn -1;}if(hash['c'] || hash['r'] || hash['o'] || hash['a'])return -1;elsereturn hash['k'];}
};

 哈希映射写法:

class Solution {
public:int minNumberOfFrogs(string croakOfFrogs) {string voice = "croak";int n = voice.size();vector<int> hash(n);//用数组作为哈希表//建立<字符,下标>的哈希映射unordered_map<char, int> index;for(int i = 0; i < voice.size(); i++)index[voice[i]] = i;for(int i = 0; i < croakOfFrogs.size(); i++){if(croakOfFrogs[i] == 'c'){if(hash[index['k']] != 0) hash[index['k']]--;//挑出一只叫完的青蛙去叫hash[index['c']]++;}else{int x = index[croakOfFrogs[i]];//检查叫声是否合法if(hash[x-1] == 0)return -1;//正常else{hash[x-1]--;hash[x]++;}}}//检查是否有未叫完的青蛙for(int i = 0; i < n-1; i++){if(hash[i] != 0)return -1;}//k的个数即是最少青蛙的个数return hash[index['k']];}
};

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

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

相关文章

软件架构复用

1.软件架构复用的定义及分类 软件产品线是指一组软件密集型系统&#xff0c;它们共享一个公共的、可管理的特性集&#xff0c;满足某个特定市场或任务的具体需要&#xff0c;是以规定的方式用公共的核心资产集成开发出来的。即围绕核心资产库进行管理、复用、集成新的系统。核心…

比较靠谱的测试进度报告

在测试的过程中&#xff0c;不要等领导过问&#xff0c;有一份比较靠谱的测试进度报告&#xff0c;让关心和支持项目的干系人心里有谱&#xff0c;有利于管理层对项目的监控和资源的支持&#xff0c;有利于项目团队成员之间沟通协调&#xff0c;及时发现问题利于项目风险控制等…

OpenHarmony实战:CMake方式组织编译的库移植

以double-conversion库为例&#xff0c;其移植过程如下文所示。 源码获取 从仓库获取double-conversion源码&#xff0c;其目录结构如下表&#xff1a; 表1 源码目录结构 名称描述double-conversion/cmake/CMake组织编译使用到的模板double-conversion/double-conversion/源…

【漏洞复现】某科技X2Modbus网关多个漏洞

漏洞描述 最近某科技X2Modbus网关出了一个GetUser的信息泄露的漏洞,但是经过审计发现该系统80%以上的接口均是未授权的,没有添加相应的鉴权机制,以下列举多个未授权接口以及获取相关敏感信息的接口。 免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律…

【C++11】异常机制

文章目录 一. 什么是异常&#xff1f;二. 为什么要引入抛异常机制&#xff1f;方法一&#xff1a;直接终止程序方法二&#xff1a;返回错误码方法三&#xff1a;C 标准库中的 setjmp 和 longjmp 组合总结 C 中处理异常的方式 三. 如何进行抛异常&#xff1f;1. 关于抛出的异常对…

[QOpenGLWidget+QMouseEvent]实时绘制长方形

复现moho-打卡第1天 - 20240402 1.1--QOpenGLWidget中显示长方形 实现方法&#xff1a;顶点着色器中给定长方形的四个顶点数据&#xff0c;代码如下&#xff1a; // 顶点位置 GLfloat vertics[1][4][3] { {{mousePressPosX,mousePressPosY,0.0},{mousePressPosX,mouseMoveP…

网络爬虫:爬取假数据

网络爬虫&#xff1a;爬取假数据 文章目录 网络爬虫&#xff1a;爬取假数据前言一、项目介绍&#xff1a;二、项目来源&#xff1a;三、架构图&#xff1a;&#xff08;流程图&#xff09;四、使用了什么技术&#xff1a;&#xff08;知识点&#xff09;五、结果示意图&#xf…

Qt使用opencv,进行视频录制,功能打开、关闭摄像头,开始、结束录制视频,暂停、继续录制,并保存视频文件

1.效果图 2 代码实现 2.1 .h文件 #ifndef VIDEORECORDWIDGET_H #define VIDEORECORDWIDGET_H#include <QWidget>#include<QFileDialog>#include <QImage> #include <QLabel> #include <QTimer> #include <opencv2/opencv.hpp>using name…

Linux实验过程

答案截图获取&#xff0c;代写&#xff1a; https://laowangall.oss-cn-beijing.aliyuncs.com/studentall.pdf 基本任务&#xff1a; 1.Linux操作系统安装 2.vi文本编辑 3. Linux用户及文件管理命令 4. Linux权限管理命令 5. Linux网络服务 提高任务&#xff1a; 1、Li…

DIY蓝牙键盘(1) - 理解 键盘报文(免费)

DIY蓝牙键盘(1) - 理解键盘报文 1. 键盘报文体验 一个键盘对于用户的体验是&#xff0c;用户按按键A他能看到字母A会在主机上显示出来。那这是如何实现的&#xff1f; 其实很简单&#xff0c;只要键盘发送下面的两个报文给主机&#xff0c;字母A就能在主机上显示出来。 (1)…

数据结构——图的应用(最小生成树,最短路径,拓扑排序,关键路径)

目录 1.最小生成树 1.概念回顾——生成树 2.最小生成树概念 2.构造最小生成树 1.MST性质 2.Prim算法 3.Kruskal 算法 4.两种算法比较 3.最短路径 1.两点间最短路径 2.某源点到其它各点最短路径 3.单源最短路径——用Dijkstra算法 4.所有顶点间的最短路径…

Flask Python:模糊查询filter和filter_by,数据库多条件查询

数据库&#xff08;sqlalchemy&#xff09;多条件查询 前言一、filter、filter_by实现过滤查询1、filter_by()基础查询并且查询&#xff08;多条件查询&#xff09; 2、filter()like&#xff1a;模糊查询and&#xff1a;并且查询or&#xff1a;或者查询 二、all(),first(),get(…

【一站式学会Kotlin】第一节 kotlin 介绍

作者介绍&#xff1a; 百度资深Android工程师T6&#xff0c;在百度任职7年半。 目前&#xff1a;成立赵小灰代码工作室&#xff0c;欢迎大家找我开发Android、微信小程序、鸿蒙项目。 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默。给大家…

中文Mistral模型介绍(Chinese-Mistral)——中文大语言模型

中文Mistral简介 Chinese-Mistral由清华大学地学系地球空间信息科学实验室开发。 该模型基于Mistral发布的Mistral-7B-v0.1训练得到。首先进行中文词表扩充&#xff0c;然后采用实验室提出的PREPARED训练框架&#xff08;under review&#xff09;在中英双语语料上进行增量预训…

RUST语言基本数据类型认识

1.RUST的基本数据类型参考: 2.使用RUST数据类型声明变量并赋值: let a:i81;//8位有符号整数let a1:u82;//8位无符号整数let b:i161;//16位有符号整数let b1:u162;//16位无符号整数let c:i321;//32位有符号整数let c1:u322;//32位无符号整数let d:i641;//64位有符号整数let d1:u…

C#编写MQTT客户端软件

主要参考C#MQTT编程06--MQTT服务器和客户端(winform版)_c#mqttserver-CSDN博客 但由于使用的.NET版本和MQTT库版本存在差异&#xff0c;因此有些不同。 MQTT协议内容在此不做描述&#xff0c;仅介绍VS使用C#的实现过程。本次使用VS2015&#xff0c;.netframwork4.6。 C#语言本身…

SQL server 查询数据库中所有的表名及行数

SQL server 查询数据库中所有的表名及行数 select a.name,b.rows from sysobjects as ainner join sysindexes as bon a.id b.id where (a.type u)and (b.indid in (0, 1)) and b.rows<50 and b.rows>20 order by a.name, b.rows desc;

Express框架搭建项目 node.js

文章目录 引言Express框架介绍express安装环境准备写一个简单的项目展示 文章总结 引言 Express是一个基于Node.js平台的轻量级Web应用框架&#xff0c;它提供了简洁的API和丰富的功能&#xff0c;使得开发者能够快速地构建Web服务器和API。本文将带领大家从零开始&#xff0c…

GDAL源码剖析(六)之GDAL开发及其调试

GDAL源码剖析&#xff08;六&#xff09;之GDAL开发及其调试-CSDN博客 一、简单的调用 关于GDAL的使用&#xff0c;网上的资料都很多&#xff0c;主要还是要熟悉GDAL的组织结构&#xff0c;类以及类的函数等&#xff0c;熟悉了&#xff0c;使用GDAL就不在话下了。最常用的就是…

苹果手表Apple Watch录了两个半小时的录音,却只能播放4秒,同步到手机也一样,还能修复好吗?

好多人遇到这个情况&#xff0c;用苹果手表Apple Watch录音&#xff0c;有的录1个多小时&#xff0c;有的录了3、4小时&#xff0c;甚至更长时间&#xff0c;因为手表没电&#xff0c;忘记保存等原因造成录音损坏&#xff0c;都是只能播放4秒&#xff0c;同步到手机也一样&…