【优选算法必刷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

【贪心算法】贪心算法七

【贪心算法】贪心算法七

贪心算法七 * 1.整数替换 * 2.俄罗斯套娃信封问题 * 3.可被三整除的最大和 * 4.距离相等的条形码 * 5.重构字符串 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励,我们一起努力吧!😃😃 1.整数替换 题目链接:397. 整数替换 题目描述: 算法原理: 解法一:模拟(递归 + 记忆化搜索) 假设n = 18,我们要干的事情是把18变成1最小的步数。因为18是一个偶数只能除2变成9,拿到9这个数字,要干的其实也是一件相同的事情,要把9变成1最小的步数。 此时这里就出现了重复的子问题,大问题是18变成1的最小步数,18/2=9后就从了9变成1的最小步数的相同问题。因此我们可以把重复子问题拿到设计出函数头 int dfs(int n) 给一个整数n返回n变成1的最小步数。函数体 其实就是题目给的,如果n是偶数/2,如果n是奇数要么+

By Ne0inhk
★ 算法OJ题 ★ 前缀和算法(上)

★ 算法OJ题 ★ 前缀和算法(上)

Ciallo~(∠・ω< )⌒☆ ~ 今天,将和大家一起做几道前缀和算法题 ~ ❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️ 澄岚主页:椎名澄嵐-ZEEKLOG博客 算法专栏:★ 优选算法100天 ★_椎名澄嵐的博客-ZEEKLOG博客 ❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️ 目录 壹  【模板】一维前缀和 1.1 题目 1.2 算法解析 1.3 撰写代码 贰  【模板】二维前缀和 2.1 题目 2.2 算法解析 2.3 撰写代码 叁  寻找数组的中心下标 3.1 题目 3.2 算法解析 3.3 撰写代码 肆  除自身以外数组的乘积 4.1

By Ne0inhk
数据结构:队列

数据结构:队列

前言  本篇文章将讲解队列的概念和结构,队列的实现等知识的相关内容,本章代码实现的知识,与单向链表相关,所以如果还没看过单向链表文章,可以看看: https://blog.ZEEKLOG.net/2401_86982201/article/details/154615762?fromshare=blogdetail&sharetype=blogdetail&sharerId=154615762&sharerefer=PC&sharesource=2401_86982201&sharefrom=from_link 一、队列概念与结构 概念 与栈的数据结构类似,队列:只允许在⼀端进⾏插⼊数据操作,在另⼀端进⾏删除数据操作的特殊线性表,队列具有先进先出FIFO(First In

By Ne0inhk
无中生有——无监督学习的原理、算法与结构发现

无中生有——无监督学习的原理、算法与结构发现

“世界上绝大多数数据都没有标签。 真正的智能,不是在已知答案中选择,而是在混沌中发现秩序。” ——无监督学习的哲学 一、为什么需要无监督学习? 在前七章中,我们系统学习了监督学习(Supervised Learning)的核心范式:给定输入 x\mathbf{x}x 和对应标签 yyy,学习映射 f:x↦yf: \mathbf{x} \mapsto yf:x↦y。无论是线性回归、决策树,还是神经网络,都依赖于标注数据这一稀缺资源。 然而,现实世界的数据绝大多数是未标注的: * 用户浏览日志(只有行为,没有“好/坏”标签); * 医学影像(只有图像,没有诊断结论); * 社交网络(只有连接关系,没有群体划分); * 传感器时序(只有数值流,没有异常标记)

By Ne0inhk