【模拟】算法实战

文章目录

  • 一、算法原理
  • 二、算法实战
    • 1. leetcode1576 替换所有的问号
    • 2. leetcode495 提莫攻击
    • 3. leetcode6 N字形变换
    • 4. leetcode38 外观数列
    • 5. leetcode1419 数青蛙
  • 三、总结


一、算法原理

模拟就是用计算机来模拟题目中要求的操作,模拟题目通常具有代码量大、操作多、思路繁琐的特点。所谓的"模拟题",用一句老话所就是"照着葫芦画瓢",根据题目的表述进行筛选提取关键要素,按需求书写代码解决实际问题。


二、算法实战

1. leetcode1576 替换所有的问号

在这里插入图片描述
替换所有的问号

解题思路:

这是一道简单的模拟题,意思是一个字符串中有 '?' 字符,将些字符替换为'a' ~ 'z'中的任意一个字符后,使得这个字符串中不会出现连续两个以上的连续字符。首先我们遍历这个字符串,先找到字符 '?' 的位置,然后从'a' ~ 'z'中从左往右开始遍历,将该问号替换为其某个字符后看该位置左右是否一样,如果不一样,继续往后遍历寻找符合要求的字符。这里注意处理边界情况。

代码实现:

class Solution {
public:string modifyString(string s) {for(int i = 0; i < s.size(); i++){if(s[i] == '?'){for(char ch = 'a'; ch <= 'z'; ch++){if((i == 0 || ch != s[i-1]) && (i == s.size()-1 || ch != s[i+1])){s[i] = ch;break;}                }}}return s;}
};

2. leetcode495 提莫攻击

在这里插入图片描述
提莫攻击

解题思路:

首先扫描这个数组,使用cnt统计答案,timeSeries[i]表示此时攻击的开始点,timeSeries[i+1]表示下一次攻击的开始点。

  • timeSeries[i + 1] - timeSeries[i] < duration,表示两次攻击重叠。cnt+=timeSeries[i + 1] - timeSeries[i]
  • timeSeries[i + 1] - timeSeries[i] >= duration,表示两次攻击不重叠, cnt+=duration。

因为最后一次攻击是肯定会持续完的,所以我们扫描数组的时候只需要扫描前n-1个元素。但是最后返回结果时候需要返回cnt+duration

代码实现:

class Solution {
public:int findPoisonedDuration(vector<int>& timeSeries, int duration) {int cnt = 0;for(int i = 0; i < timeSeries.size() - 1; i++){int tmp = timeSeries[i + 1] - timeSeries[i];if(tmp < duration)cnt += tmp;elsecnt += duration;}return cnt + duration;}
};

3. leetcode6 N字形变换

在这里插入图片描述
N字形变换

解题思路:

首先我们应该先搞清楚从原字符串到目标字符串是如何变换而来的。

在这里插入图片描述

我们可以看到这个过程:先将该字符串以'N'字形的顺序依次填入一个二维数组中,然后将该二维数组中的内容从上到下一行一行拼接起来即可。这里我们可以从中找一些规律出来:

在这里插入图片描述

代码实现:

class Solution {
public:string convert(string s, int numRows) {string ret = "";if(numRows == 1)return s;int sub = 2*numRows - 2;for(int i = 0; i < numRows; i++){// 处理第一行和最后一行if(i == 0 || i == numRows-1){for(int j = i; j < s.size(); j += sub){ret += s[j];}}else{// 处理中间行for(int k = i, p = sub - k; k < s.size() || p < s.size(); k += sub, p += sub){if(k < s.size()) ret += s[k];if(p < s.size()) ret += s[p];}}}return ret;}
};

4. leetcode38 外观数列

在这里插入图片描述
外观数列

解题思路:

题目告诉了我们数列的每一项的变换过程是通过上一项推导出来的,因此我们可以根据上一项模拟数列每一项的形成过程。在数列每一项的模拟过程中,我们依然使用滑动窗口的算法原理来实现。

代码实现:

class Solution {
public:string countAndSay(int n) {// 使用双指针算法进行模拟string start = "1";while(--n){string tmp;for(int left = 0, right = 0; left < start.size(); right++){if(start[left] != start[right]){tmp += to_string(right - left);tmp += start[left];left = right;}}start = tmp;}return start;}
};

5. leetcode1419 数青蛙

在这里插入图片描述
数青蛙

解题思路:

这道题目属于典型的比较难的模拟题,先开一个哈希表,然后将"croak"按照<char, int>的方式映射进哈希表,这里的int指的是"croak"中字符的下标。开一个cnt来计数,统计每一个字符出现的次数。

从前向后遍历字符串,如果ch=='c',说明需要一只青蛙开始发出蛙鸣,如果前面统计cnt[n - 1],这里的n-1表示"croak"字符串的最后一个’k’的下标,意思是如果cnt[n - 1]已经出现过了,说明前面有一只青蛙已经将"croak",这个字符串全部叫了一遍,那么我们让前面的青蛙继续从头开始叫就可以了,不需要增加青蛙的数量,因此让cnt[n - 1]--,cnt[0]++,如果cnt[n - 1] == 0, 则直接让cnt[0]++。

如果ch!='c',则说明一只青蛙正在发出蛙鸣的过程中,此时我们让此时青蛙发出蛙鸣的字符的前一个字符的下标cnt[c前面的字符]- -,然后让正在遍历的字符数量cnt[c]++,如果中途发现cnt[c前面的字符] == 0, 说明该字符连续出现了两次以上,或者字幕出现的顺序有问题。直接返回-1即可。

最后我们统计的时候只需要关心"croak"中最后一个’k’出现了几次即可,同时,我们还需要遍历cnt中除最后一个元素外,看前面的字母出现的次数是否为0,若不为0,说明字幕出现的顺序不符合要求,直接返回-1。

代码实现:

class Solution {
public:int minNumberOfFrogs(string croakOfFrogs) {string t = "croak";int n = t.size();vector<int> cnt(n);unordered_map<char, int> hash;for(int i = 0; i < n; i++) hash[t[i]] = i;for(char ch : croakOfFrogs){if(ch == 'c'){if(cnt[n - 1]) cnt[n - 1]--;cnt[0]++;}else{int i = hash[ch];if(cnt[i - 1])cnt[i - 1]--, cnt[i]++;else return -1;}}for(int i = 0; i < n - 1; i++)if(cnt[i] != 0) return -1;return cnt[n - 1];}
};

三、总结

模拟的过程就是对真实场景尽可能的模拟,但我们需要注意的是:模拟题并没有我们所想象的那么简单,它的代码中可能会有很多的'坑',我们在写模拟算法的过程中需要谨慎。

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

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

相关文章

Java稀疏数组

目录 1.稀疏数组 2.稀疏数组的使用 2.1 二维数组转换为稀疏数组 2.2 稀疏数组转换为二维数组 1.稀疏数组 稀疏数组&#xff08;Sparse Array&#xff09;&#xff1a;当一个数组中的大部分元素为相同的值&#xff0c;可使用稀疏数组来保存该数组&#xff0c;可以将稀疏数组…

记录--怎么实现一个3d翻书效果

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 本篇主要讨论以下两种翻书动画的实现&#xff1a; 第一种是整页翻转的效果&#xff1a; 这种整页翻转的效果主要是做rotateY的动画&#xff0c;并结合一些CSS的3d属性实现。 第二种折线翻转的效果&…

北京筑龙受邀出席中物联“采购供应链中国行—走进雄安”活动

日前&#xff0c;“采购供应链中国行—走进雄安”活动在河北雄安新区成功举办&#xff0c;来自30家相关单位的50余名领导和代表参加了本次活动。活动由中国物流与采购联合会公共采购分会主办&#xff0c;中国物流与采购联合会采购委、中国雄安集团有限公司、河北雄安新区招标投…

【数据结构】二叉数的存储与基本操作的实现

文章目录 &#x1f340;二叉树的存储&#x1f333;二叉树的基本操作&#x1f431;‍&#x1f464;二叉树的创建&#x1f431;‍&#x1f453;二叉树的遍历&#x1f3a1;前中后序遍历&#x1f4cc;前序遍历&#x1f4cc;中序遍历&#x1f4cc;后续遍历 &#x1f6eb;层序遍历&am…

商家必读:影响快递物流速度的这几个关键因素

在这个迅速发展的数字时代&#xff0c;消费者对于快速、高效的购物体验有着越来越高的期望。而作为商家&#xff0c;能否满足顾客对快递速度的要求将直接影响到商家的竞争力和业务发展。今天就和大家聊聊一个在电商行业中至关重要的话题——快递的物流速度对商家的重要性。 首…

Linux——socket网络通信

一、什么是socket Socket套接字 由远景研究规划局&#xff08;Advanced Research Projects Agency, ARPA&#xff09;资助加里福尼亚大学伯克利分校的一个研究组研发。其目的是将 TCP/IP 协议相关软件移植到UNIX类系统中。设计者开发了一个接口&#xff0c;以便应用程序能简单地…

【RuoYi移动端】uniApp导入和引用uView2.0插件

一、打开uiew官网 安装 | uView 2.0 - 全面兼容 nvue 的 uni-app 生态框架 - uni-app UI 框架uView UI&#xff0c;是 uni-app 生态最优秀的 UI 框架&#xff0c;全面的组件和便捷的工具会让您信手拈来&#xff0c;如鱼得水https://uviewui.com/components/install.html 也可直…

hadoop大数据集群中更换磁盘,balance的速度缓慢问题(解决)

hadoop大数据集群中更换磁盘&#xff0c;balance的速度缓慢问题&#xff08;解决&#xff09; 看现象只有4个bloucks在执行的 调整参数&#xff1a; 增大配置参数&#xff0c;观察重新负载的速度 修改配置文件 hdfs-site.xml dfs.datanode.balance.max.concurrent.moves100 …

​iOS上架审核宝典:如何避免被拒一次提交成功

Xcode 摘要&#xff1a;本文整理了iOS上架需要注意的事项&#xff0c;以帮助从事iOS开发和App运营的朋友们避免审核被拒的困扰。通过遵循这些指南&#xff0c;我们可以在一次提交中成功地将应用上架&#xff0c;并节省宝贵的时间和精力。 引言&#xff1a; 从事iOS开发和App运…

【SpringBoot】最基础的项目架构(SpringBoot+Mybatis-plus+lombok+knife4j+hutool)

汝之观览&#xff0c;吾之幸也&#xff01; 从本文开始讲下项目中用到的一些框架和技术&#xff0c;最基本的框架使用的是SpringBoot(2.5.10)Mybatis-plus(3.5.3.2)lombok(1.18.28)knife4j(3.0.3)hutool(5.8.21),可以做到代码自动生成&#xff0c;满足最基本的增删查改。 一、新…

java+ssm+mysql农场信息管理系统

项目介绍&#xff1a; 本系统为基于jspssmmysql的农场信息管理系统&#xff0c;功能如下&#xff1a; 用户&#xff1a;注册登录系统&#xff0c;菜地信息管理&#xff0c;农作物信息管理&#xff0c;种植信息管理&#xff0c;客户信息管理&#xff0c;商家信息管理&#xff…

一个简单的vim例子

一.欢迎来到我的酒馆 在本章节介绍vim工具。 目录 一.欢迎来到我的酒馆二.什么是vim 二.什么是vim 2.1什么是vim vim是一种Linux命令行类型 的文本编辑器。vim指的是"vi improved"&#xff0c;意思是vi工具的升级版。vim是基于vi实现的&#xff0c;它提供了…

电工-照明电路施工图

照明电路施工图 上面介绍的电气照明基本电路用作施工的依据是不够的&#xff0c;这是因为图上并没有注明电气元件的规格、型号、安装要求、线路敷设方式以及其他一些特征。作为实际电路安装的依据&#xff0c;必须是根据国家颁布的有关电器技术标准和统一符号绘制的施工图。照…

文本匹配实战系列

引言 本系列文章开始介绍深度学习在文本匹配领域的应用&#xff0c;并且会尝试得到各种模型在给定的数据集上的表现。 深度文本匹配发展比较久&#xff0c;积累了很多文本匹配方法。也有很多的分类方式&#xff0c;一种分类方式是表示型和交互型。 表示型方法 表示型(repre…

kafka架构和原理详解

Apache Kafka 是一个分布式流数据平台,用于高吞吐量、持久性、可扩展的发布和订阅消息。它具有高度的可靠性,被广泛用于构建实时数据流处理、日志收集和数据管道等应用。 基本架构 1. 主题(Topic): 主题是消息的逻辑分类生产者将消息发布到特定的主题中,而消费者可以订阅…

LAMP 配置与应用

LAMP 架构的组成 LAM(M)P&#xff1a; L&#xff1a;linux A&#xff1a;apache (httpd) M&#xff1a;mysql, mariadb P&#xff1a;php, perl, python apache的功能&#xff1a; 第一&#xff1a;处理http的请求、构建响应报文等自身服务&#xff1b; 第二&#xff1a…

Java之API详解之Biginteger类的详解

6 BigInteger类 6.1 引入 平时在存储整数的时候&#xff0c;Java中默认是int类型&#xff0c;int类型有取值范围&#xff1a;-2147483648 ~ 2147483647。如果数字过大&#xff0c;我们可以使用long类型&#xff0c;但是如果long类型也表示不下怎么办呢&#xff1f; 就需要用…

低代码是什么?能做什么?

2014 年全球权威咨询机构 Forrester 在报告中首次引入了低代码的概念&#xff0c;放眼彼时的中国市场&#xff0c;低代码这一名词还鲜为人知。随着国家积极推动数字化发展&#xff0c;越来越多的企业投入到了数字化经济的建设中&#xff0c;低代码也在这样的大环境中快速成长。…

gitcode中删除已有的项目

镜像地址&#xff1a; https://www.jianshu.com/p/504c1418adb7?v1693021320653 扩展阅读 如何在GitLab中删除一个项目 https://www.codenong.com/cs106866762/ 简介&#xff1a; 如何在GitLab中删除一个项目 最近GIT上建了太多项目。想清一下&#xff0c;就在网上查了查…

面向对象的设计原则

设计模式 Python 设计模式&#xff1a;对软件设计中普遍存在&#xff08;反复出现&#xff09;的各种问题&#xff0c;所提出的解决方案。每一个设计模式系统地命名、解释和评价了面向对象系统中一个重要的和重复出现的设计 面向对象 三大特性&#xff1a;封装、继承、多态 …