算法练习——模拟题

前言:模拟题的特点在于没有什么固定的技巧,完全考验自己的代码能力,因此有助于提升自己的代码水平。如果说一定有什么技巧的话,那就是有的模拟题能够通过找规律来简化算法。

一:替换所有问号

题目要求:

解题思路:

思路:首先遍历字符串s找寻字符 '?';找到后,将'a'拷贝给该位置并循环++,直到中间字母和左右字母均不相同。

细节:左端点和右端点需要单独考虑

实现代码:

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

分析:if((i == 0 || ch != s[i-1]) && (i == n-1 || ch != s[i+1])); 该串代码

一个条件涵盖三种情况:

①:左端点 i == 0; ch != s[i+1];

②:右端点 i == n-1;ch !=s[i-1];

③:中间点 ch !=s[i-1];ch != s[i+1];

学无止境 :-(

二:提莫攻击

题目要求:

解题思路:

思路

定义一个变量total,用于记录总共的中毒时间。

攻击间隔 >= 中毒时间,total+=d;

攻击间隔 <   中毒时间,total+=(攻击间隔的时间);

最后返回时,total+=d,因为最后一次的中毒时间一定是吃满的。

实现代码:

    int findPoisonedDuration(vector<int>& timeSeries, int duration) {int n = timeSeries.size();int total = 0;for(int i = 0; i < n-1; i++){int gap = timeSeries[i+1] - timeSeries[i];if(gap >= duration){total+=duration;}else{total += gap;}}return total+duration;}

三:Z字形变换

题目要求:

解题思路:

思路:这道题就是模拟题中典型的通过找规律来简化代码,以下通过下标来找寻规律。

实现代码:

    string convert(string s, int numRows) {if(numRows == 1) return s;int n = s.size();int gap = numRows*2 - 2;int gap1 = gap;int gap2 = 0;string tmp;for(int i = 1; i <= numRows; i++){int j = i-1;while((i == 1 || i == numRows) && j < n){tmp+=s[j];j+=gap; }while(i > 1 && i < numRows && j < n){tmp += s[j];j += gap1;if(j < n){tmp += s[j];j += gap2;}}gap1 -= 2;gap2 += 2;}return tmp;}

四:外观数列

题目要求:

解题思路:

分析:本题的难点(对编者我而言)在于把题目看懂

除了1,对于其他数字而言,下一个数字是对上一个数字解释

即:

countAndSay(1) = '1';  

countAndSay(2) = "1" 的行程长度编码 = "11"       解释:一个1;

countAndSay(3) = "11" 的行程长度编码 = "21"     解释:一个2,一个1

countAndSay(4) = "21" 的行程长度编码 = "1211" 解释:一个1,一个2,两个1, 

最后输出n对应的行程长度编码。

思路

定义一个变量 string s;

外循环遍历1~n,内循环遍历s,通过双指针法(pre cur)记录每个数字出现的次数,将数字以及其对应出现的个数分别记录到 string tmp中,当该次循环结束时,将 tmp 赋值给 s ,同时tmp清空tmp,用于记录下次循环的行程长度编码。

实现代码:

    string countAndSay(int n) {string s("1");for(int i = 1; i < n; i++){int pre = 0;int cur = 0;string tmp;while(cur < s.size()){int count = 0;while(cur < s.size() && s[cur] == s[pre]){count++;cur++;}tmp += to_string(count) + s[pre];pre = cur;}s = tmp;tmp.clear();}return s;}

to_string:将其他数据类型转换成string型

五:数青蛙

题目要求:

解题思路:

分析

        每一只青蛙都必须叫出完整的一声 "croak",但是可能存在示例2这样的情况,一只青蛙没叫完,另一只青蛙叫了。

        示例3不是有效的蛙声组合。因为一声完整的蛙声组合是 "croak",也就是说o的前面一定有一个字符'r',而示例3当连续两个o中,第一个o已经和前面一个r组成了一对,而第二个o前面没有r了,因此不符合蛙声("croak")的字符组合

       

思路

👉:定义一个 string s; 用于保存蛙声“croak”,

👉:定义一个 unordered_map<char,int> haxi 让字母与下标建立映射关系,

:此时 int index = haxi[字符] 就可以找到字符对应的下标

👉:定义一个 vector<int> tmp(s.size()) 下标从0开始到4,依次对应 c ~ k 五个字符以及其对应出现的个数

通过上述定义,就得到了如图所示的映射关系:

外循环遍历字符串croak0fFrogs

当遍历到除‘c’以外的其他字符时:判断 tmp中,前一个字符是否大于0

若大于0则,tmp[index]++; tmp[index-1]--;

若等于0则,说明当前字符串不是有效组合直接返回-1

循环结束时,此时 字符k的个数即为当前青蛙个数

当遍历到字符c时情况比较特殊:

①:如果k=0,说明这是某只青蛙第一次叫,tmp[index]++

②:如果k!=0,说明这可能是某只青蛙第二次叫,因此tmp[haxi[k]]--,tmp[index]++;

当上述循环结束时,要判断tmp中,除k以外是否存在其他字符,若存在,则返回-1。

实现代码:

        string s = "croak";int n = s.size();vector<int> tmp(n);unordered_map<char,int> haxi;for(int i = 0; i < n; i++){haxi[s[i]] = i; //建立哈希表中的映射关系}for(auto w : croakOfFrogs){int index = haxi[w];if(w == 'c'){if(tmp[n-1] > 0){tmp[n-1]--;  }tmp[0]++;}else{if(tmp[index-1] > 0){tmp[index-1]--;tmp[index]++;}else{return -1;}}}for(int i = 0; i < n-1; i++){if(tmp[i] > 0){return -1;}}return tmp[n-1];}

:博主尚未学习haxi表,这道题是haxi算法的第一次浅尝试,通过哈希表建立字符与下标之间的映射关系,再通过vector<int> 统计个数。不同字符→对应下标→对应个数。

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

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

相关文章

Idea创建JDK17的maven项目失败

Idea创建JDK17的maven项目失败 Error occurred during initialization of VM Could not find agent library instrument on the library path, with error: Can’t find dependent libraries Possible solution: Check your maven runner VM options. Open Maven Runner setti…

VSCode设置Playwright教程

1.安装扩展 打开VS Code&#xff0c;在扩展—>搜索"Playwright Test for VSCode"&#xff0c;点击安装 按快捷键CommandShiftP&#xff0c;输入install playwright&#xff0c;点击安装Playwright 安装成功会有如下提示 2.调试脚本 打开tests/example.spec.ts文…

HTML新特性|01 音频视频

音频 1、Audio (音频) HTML5提供了播放音频文件的标准 2、control(控制器) control 属性供添加播放、暂停和音量控件 3、标签: <audio> 定义声音 <source> 规定多媒体资源,可以是多个<!DOCTYPE html> <html lang"en"> <head><…

【深度学习】卷积网络代码实战ResNet

ResNet (Residual Network) 是由微软研究院的何凯明等人在2015年提出的一种深度卷积神经网络结构。ResNet的设计目标是解决深层网络训练中的梯度消失和梯度爆炸问题&#xff0c;进一步提高网络的表现。下面是一个ResNet模型实现&#xff0c;使用PyTorch框架来展示如何实现基本的…

雷电「模拟器」v9 最新清爽去广

前言 雷电模拟器9是基于安卓9内核开发的全新版本模拟器 安装环境 [名称]&#xff1a;雷电「模拟器」 [大小]&#xff1a;579MB [版本]&#xff1a;9.1.34 [语言]&#xff1a;简体中文 [安装环境]&#xff1a;Windows 通过网盘分享的文件&#xff1a;雷电模拟器 链接:…

大模型 API 接入初探

文章目录 大模型 API 接入初探一、使用大模型 API 的前置步骤&#xff08;一&#xff09;注册账户与获取凭证&#xff08;二&#xff09;理解 API 文档 二、三个常用 API&#xff08;一&#xff09;列出模型&#xff08;二&#xff09;FIM 补全&#xff08;三&#xff09;对话补…

实时在线翻译谷歌插件

Real - time Translation插件的安装 1、下载插件并解压 2、打开谷歌浏览器&#xff0c;在地址栏输入 “chrome://extensions/” 进入扩展程序页面. 3、开启页面右上角的 “开发者模式”. 4、点击 “加载已解压的扩展程序” 按钮&#xff0c;选择之前解压的文件夹&#xff0c;点…

[数据集][图像分类]常见鱼类分类数据集2w张8类别

数据集类型&#xff1a;图像分类用&#xff0c;不可用于目标检测无标注文件 数据集格式&#xff1a;仅仅包含jpg图片&#xff0c;每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数)&#xff1a;7554&#xff08;剩余1w多为测试集&#xff09; 分类类别数&#xff1a;…

uniapp开发小程序内嵌h5页面,video视频两边有细小黑色边框

1.问题如图 2.原因分析 是否为设置上述属性呢&#xff1f; 设置了&#xff0c;但是仍然有黑边。经过选中页面元素分析后&#xff0c;判断video元素本身就有这种特点&#xff0c;就是视频资源无法完全铺满元素容器。 3.解决方案

【SpringMVC】SpringMVC 快速入门

通常&#xff0c;Web 应用的工作流程如下&#xff1a; 用户通过浏览器访问前端页面&#xff1b; 前端页面通过异步请求向后端服务器发送数据&#xff1b; 后端采用“表现层-业务层-数据层”三层架构进行开发&#xff1a; 表现层接收页面请求将请求参数传递给业务层业务层访问…

OpenGL变换矩阵和输入控制

在前面的文章当中我们已经成功播放了动画&#xff0c;让我们的角色动了起来&#xff0c;这一切变得比较有意思了起来。不过我们发现&#xff0c;角色虽然说是动了起来&#xff0c;不过只是在不停地原地踏步而已&#xff0c;而且我们也没有办法通过键盘来控制这个角色来进行移动…

【Spring MVC 核心机制】核心组件和工作流程解析

在 Web 应用开发中&#xff0c;处理用户请求的逻辑常常会涉及到路径匹配、请求分发、视图渲染等多个环节。Spring MVC 作为一款强大的 Web 框架&#xff0c;将这些复杂的操作高度抽象化&#xff0c;通过组件协作简化了开发者的工作。 无论是处理表单请求、生成动态页面&#x…

Verilog 过程赋值

关键词&#xff1a;阻塞赋值&#xff0c;非阻塞赋值&#xff0c;并行 过程性赋值是在 initial 或 always 语句块里的赋值&#xff0c;赋值对象是寄存器、整数、实数等类型。 这些变量在被赋值后&#xff0c;其值将保持不变&#xff0c;直到重新被赋予新值。 连续性赋值总是处…

[并发与并行] python如何构建并发管道处理多阶段任务?

文章目录 1. 背景&目标2. show me the code3.知识点4. 总结 1. 背景&目标 背景&#xff1a;一个任务可分为多个阶段(各个阶段非CPU密集型任务&#xff0c;而是属于IO密集型任务)&#xff0c;希望每个阶段能够交给各自的线程去执行。 目标&#xff1a;构建支持多并发的…

07 基于OpenAMP的核间通信方案

引言 ZYNQ7020有两个CPU核心&#xff0c;这两个核心可以采用SMP或AMP方式进行调度&#xff0c;当采用AMP方式进行调度时核0和核1可以运行不同的操作系统&#xff0c;如核0运行Linux系统&#xff0c;提供有些复杂的用户交互工作&#xff0c;核1运行实时操作系统&#xff0c;对设…

7.若依参数设置、通知公告、日志管理

参数设置 对系统中的参数进行动态维护。 关闭验证码校验功能 打开页面注册功能 需要修改前端页面代码 通知公告 促进组织内部信息传递 若依只提供了一个半成品&#xff0c;只实现了管理员可以添加通知公告。 日志管理 追踪用户行为和系统运行状况。 登录日志 和操作日志…

基于Docker+模拟器的Appium自动化测试(二)

模拟器的设置 打开“夜神模拟器”的系统设置&#xff0c;切换到“手机与网络”页&#xff0c;选中网络设置下的“开启网络连接”和“开启网络桥接模式”复选框&#xff0c;而后选择“静态IP”单选框&#xff0c;在IP地址中输入“192.168.0.105”&#xff0c;网关等内容不再赘述…

大数据技术-Hadoop(三)Mapreduce的介绍与使用

目录 一、概念和定义 二、WordCount案例 1、WordCountMapper 2、WordCountReducer 3、WordCountDriver 三、序列化 1、为什么序列化 2、为什么不用Java的序列化 3、Hadoop序列化特点&#xff1a; 4、自定义bean对象实现序列化接口&#xff08;Writable&#xff09; 4…

【数据仓库】SparkSQL数仓实践

文章目录 集成hive metastoreSQL测试spark-sql 语法SQL执行流程两种数仓架构的选择hive on spark数仓配置经验 spark-sql没有元数据管理功能&#xff0c;只有sql 到RDD的解释翻译功能&#xff0c;所以需要和hive的metastore服务集成在一起使用。 集成hive metastore 在spark安…

基本算法——回归

本节将通过分析能源效率数据集&#xff08;Tsanas和Xifara&#xff0c;2012&#xff09;学习基本的回归算法。我们将基 于建筑的结构特点&#xff08;比如表面、墙体与屋顶面积、高度、紧凑度&#xff09;研究它们的加热与冷却负载要 求。研究者使用一个模拟器设计了12种不…