【优选算法必刷100题:专题六】(模拟算法)第039~343题:替换所有的问号、提莫攻击、Z 字形变换、外观数列、数青蛙

【优选算法必刷100题:专题六】(模拟算法)第039~343题:替换所有的问号、提莫攻击、Z 字形变换、外观数列、数青蛙

在这里插入图片描述


🎬 个人主页艾莉丝努力练剑
专栏传送门:《C语言》《数据结构与算法》《C/C++干货分享&学习过程记录
Linux操作系统编程详解》《笔试/面试常见算法:从基础到进阶》《Python干货分享

⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平


🎬 艾莉丝的简介:

在这里插入图片描述

🎬艾莉丝的算法专栏简介:

在这里插入图片描述

文章目录


在这里插入图片描述

039 替换所有的问号

力扣链接:1576. 替换所有的问号

题目描述:

在这里插入图片描述

​1.1 解法:模拟的思想

纯模拟。从前往后遍历整个字符串,找到问号之后,就用a~z的每一个字符去尝试替换即可。

1.2 算法实现

// 模拟classSolution{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;}};
在这里插入图片描述

1.3 博主手记

本题整个的思路、算法原理、解题过程博主在纸上推导了一遍,大家可以参考一下手记的推导过程!最好做题的过程中自己也推导一遍!!!自己能够推导很重要!
在这里插入图片描述

040 提莫攻击

力扣链接:495. 提莫攻击

题目描述:

在这里插入图片描述

2.1 解法:模拟 + 分情况讨论

思路:模拟 + 分情况讨论。

我们只要计算相邻两个时间点的差值即可:

(1)如果差值大于等于中毒时间,说明上次中毒可以持续duration秒;(2)如果差值小于中毒时间,那么上次的中毒只能持续两者的差值。

2.2 算法实现

classSolution{public:intfindPoisonedDuration(vector<int>& timeSeries,int duration){int ret =0;int n = timeSeries.size();for(int i =1;i < n;i++)// 计算当前位置和前面位置的差{int x = timeSeries[i]- timeSeries[i -1];if(x >= duration){ ret += duration;}else{ ret += x;}}// 最后一次中毒的时间是要把中毒时间全部算上的return ret + duration;}};
在这里插入图片描述

2.3 博主手记

本题整个的思路、算法原理、解题过程博主在纸上推导了一遍,大家可以参考一下手记的推导过程!最好做题的过程中自己也推导一遍!!!自己能够推导很重要!
在这里插入图片描述

041 Z 字形变换

力扣链接:6. Z 字形变换

题目描述:

在这里插入图片描述

3.1 算法思路:模拟 +找规律

3.1.1 表格1:row = 4时各行的数字序列

找规律,用row代替行数,row = 4时画出的N字形如下:

行号数字(表达式)数字(值,row=4)
10, 2row-2, 4row-40, 6, 12
21, 2row-3, 2row-1, 4row-5, 4row-31, 5, 7, 11, 13
32, 2row-4, 2row, 4row-6, 4row-22, 4, 8, 10, 14
43, 2row+1, 4row-13, 9, 15

3.1.2 表格2:用周期T = 2row - 2表示的数字规律

不难发现,数据是以2roW-2为一个周期进行规律变换的。将所有数替换成用周期来表示的变量:

行号 (i)数字序列(用 T 表示)说明
i=00, T, 2T公差为 T 的等差数列
i=11, T-1, T+1, 2T-1, 2T+1第一个数为 i,之后每组两个数围绕 T 的倍数对称
i=22, T-2, T+2, 2T-2, 2T+2同上
i=33, T+3, 2T+3公差为 T 的等差数列(最后一行数字为 i, T+i, 2T+i, …)

可以观察到,第一行、第四行为差为2roW-2的等差数列;第二行、第三行除了第一个数取值为行数,每组下标为(2n - 1 , 2n)的数围绕(2row - 2)的倍数左右取值。

以此规律,我们可以写出迭代算法。

3.2 算法实现

classSolution{public: string convert(string s,int numRows){// 处理边界情况if(numRows ==1)return s;// 公差d == 0 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 k =1;k < numRows -1;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];}}// 3、处理最后一行for(int i = numRows -1;i < n;i += d) ret += s[i];return ret;}};
在这里插入图片描述

3.3 博主手记

本题整个的思路、算法原理、解题过程博主在纸上推导了一遍,大家可以参考一下手记的推导过程!最好做题的过程中自己也推导一遍!!!自己能够推导很重要!
在这里插入图片描述

042 外观数列

力扣链接:38. 外观数列

题目描述:

在这里插入图片描述

4.1 解法思路:模拟

在这里插入图片描述

所谓【外观数列】,其实只是依次统计字符串中连续且相同的字符的个数。依照题意,依次模拟即可。

4.2 算法实现

classSolution{public: string countAndSay(int n){ string ret ="1";for(int i =1;i < n;i++)// 解释 n - 1次 ret 即可{ string tmp;int len = ret.size();for(int left =0,right =0;right < len;){while(right < len && ret[left]== ret[right]) right++; tmp +=to_string(right - left)+ ret[left];// to_string:个数转换 left = right;} ret = tmp;}return ret;}};
在这里插入图片描述

4.3 博主手记

本题整个的思路、算法原理、解题过程博主在纸上推导了一遍,大家可以参考一下手记的推导过程!最好做题的过程中自己也推导一遍!!!自己能够推导很重要!
在这里插入图片描述

043 数青蛙

力扣链接:1419. 数青蛙

题目描述:

在这里插入图片描述

5.1 解法:位运算

模拟青蛙的叫声。

  • 当遇到'r''o''a''k'这四个字符的时候,我们要去看看每一个字符对应的前驱字符,有没有青蛙叫出来。如果有青蛙叫出来,那就让这个青蛙接下来喊出来这个字符;如果没有,直接返回-1;
  • 当遇到'c'这个字符的时候,我们去看看'k'这个字符有没有青蛙叫出来。如果有,就让这个青蛙继续去喊'c'这个字符;如果没有的话,就重新搞一个青蛙。

5.2 算法实现

classSolution{public:intminNumberOfFrogs(string croakOfFrogs){ string t ="croak";// 叫声int n = t.size();// 长度 vector<int>hash(n);// 用数组来模拟哈希表 unordered_map<char,int> index;// [x , x这个字符对应的下标]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];}};
在这里插入图片描述

5.3 博主手记

本题整个的思路、算法原理、解题过程博主在纸上推导了一遍,大家可以参考一下手记的推导过程!最好做题的过程中自己也推导一遍!!!自己能够推导很重要!
在这里插入图片描述

结尾

uu们,本文的内容到这里就全部结束了,艾莉丝再次感谢您的阅读!

结语:希望对学习Python相关内容的uu有所帮助,不要忘记给博主“一键四连”哦!

往期回顾:

【优选算法必刷100题:专题五】(位运算算法)第033~38题:判断字符是否唯一、丢失的数字、两整数之和、只出现一次的数字 II、消失的两个数字

🗡博主在这里放了一只小狗,大家看完了摸摸小狗放松一下吧!🗡૮₍ ˶ ˊ ᴥ ˋ˶₎ა

Read more

【Linux进程(五)】Linux / Windows命令行参数与环境变量深度解析 | 附代码实验与配置技巧

【Linux进程(五)】Linux / Windows命令行参数与环境变量深度解析 | 附代码实验与配置技巧

🎬 个人主页:艾莉丝努力练剑 ❄专栏传送门:《C语言》《数据结构与算法》《C/C++干货分享&学习过程记录》 《Linux操作系统编程详解》《笔试/面试常见算法:从基础到进阶》《Python干货分享》 ⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平 🎬 艾莉丝的简介: 文章目录 * 本文预告 * 4 ~> 环境变量和命令行参数 * 4.1 命令行参数 * 4.1.1 命令行参数的原理 * 4.1.2 命令行参数可以实现选项功能——以关机程序(shutdown)为例 * 4.1.3 补充:命令行参数名可以自定义 * 4.2 环境变量 * 4.2.1

By Ne0inhk
【Linux】线程控制

【Linux】线程控制

📝前言: 这篇文章我们来讲讲Linux——线程控制 🎬个人简介:努力学习ing 📋个人专栏:Linux 🎀ZEEKLOG主页 愚润求学 🌄其他专栏:C++学习笔记,C语言入门基础,python入门基础,C++刷题专栏 目录 * 一,使用介绍 * 1. POSIX线程库 * 2. 创建线程 * 3. 结束线程 * 4. 等待线程 * 5. 分离线程 * 二,使用示例 * 三,用户层与内核层的“线程” * 1. 原码解析 * 2. 线程栈 * 3. 线程局部存储 * 四,模拟封装线程库 * mythread.hpp * Main.cpp * 运行效果 一,使用介绍 1.

By Ne0inhk
Linux操作系统从入门到实战(二)手把手教你安装VMware17pro与CentOS 9 stream,实现Vim配置,并配置C++环境

Linux操作系统从入门到实战(二)手把手教你安装VMware17pro与CentOS 9 stream,实现Vim配置,并配置C++环境

Linux操作系统从入门到实战(二)手把手教你安装VMware17pro与CentOS 9.0 stream,实现Vim配置,并编译C++文件 * 前言 * 一、安装VMware17pro * 二、安装CentOS9.0 * 2.1 为什么选择CentOS9,与CentOS7对比 * 2.1 官网下载CentOS9.0 * 2.2 国内清华大学镜像下载CentOS9.0 * 三、实现Linux环境搭建 * 四、配置Vim环境 * 1. 安装必要的软件 * 2. 配置 Vim 高亮显示 * 五、编译运行C++代码 前言 * 在前面的博客里,我们讲解了什么是操作系统,以及它的历史,接下来我们开始构建Linxu环境 * 本次博客将带领大家完成 CentOS 9.0 的安装,

By Ne0inhk
Flutter 三方库 fluent_result 的鸿蒙化适配指南 - 实现优雅的函数式错误处理模型、支持透明的结果封装与业务逻辑流转控制

Flutter 三方库 fluent_result 的鸿蒙化适配指南 - 实现优雅的函数式错误处理模型、支持透明的结果封装与业务逻辑流转控制

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 fluent_result 的鸿蒙化适配指南 - 实现优雅的函数式错误处理模型、支持透明的结果封装与业务逻辑流转控制 前言 在进行 Flutter for OpenHarmony 的大规模业务逻辑开发时,传统的异常处理(Try-Catch)往往会导致代码散落在各处,且难以在函数调用链中优雅地传递失败原因。fluent_result 引入了源自函数式编程的“Result 对象”概念。它通过将成功的数据和失败的错误封装在同一个返回值中,让鸿蒙应用的代码流变得更加清晰和健壮。本文将探讨如何在鸿蒙端利用该库构建“零崩溃”调用链。 一、原理解析 / 概念介绍 1.1 基础原理 fluent_result 放弃了通过“抛出(Throw)”异常来控制流程的模式,转而返回一个 Result<T&

By Ne0inhk