优选算法——模拟


👇作者其它专栏

《数据结构与算法》《算法》《C++起始之路》


相关题解

1.1替换所有的问号

算法思路:

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

class Solution { public: 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; } };

2.2提莫攻击

算法思路:

模拟+分情况讨论。

计算相邻两个时间点的差值:

        i.若差值大于等于中毒时间,说明上次中毒可以持续duration秒;

        ii.若差值小于中毒时间,说明此时发生了中毒叠加,那么上次的中毒只能持续两者的差值。

class Solution { public: int findPoisonedDuration(vector<int>& timeSeries, int duration) { int ret=0; for(int i=1;i<timeSeries.size();i++){ int x=timeSeries[i]-timeSeries[i-1]; if(x<=duration) ret+=x; else ret+=duration; } //别忘记,最后一次的中毒也需要加上一个duration return ret+duration; } };

2.3Z 字形变换

算法思路(模拟+找思路):

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

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

第一行的数是:0,2row-2,4row-4;

第一行的数是:1,(2row-2)-1,(2row-2)+1,(4row-4)-1,(4row-4)+1;

第一行的数是:2,(2row-2)-2,(2row-2)+2,(4row-4)-2,(4row-4)+2;

第一行的数是:3,(2row-2)+3,(4row-4)+3。

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

即首末行规律相同,中间行规律相同。

class Solution { public: string convert(string s, int numRows) { //处理边界情况 if(numRows==1) return s; 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 i=1;i<numRows-1;i++){//中间的每一行 for(int j=i,k=d-i;j<n||k<n;j+=d,k+=d){ if(j<n) ret+=s[j]; if(k<n) ret+=s[k]; } } //3.处理最后一行 for(int i=numRows-1;i<n;i+=d){ ret+=s[i]; } return ret; } };

2.4外观数列

算法思路:

【外观数列】,就是依次统计字符串中连续且相同的字符的个数。

class Solution { public: string countAndSay(int n) { string s("1"); n--;//循环n-1次 while(n--){ string tmp; int left=0,right=0,len=s.size(); while(right<len){ while(s[left]==s[right]&&right<len) right++; tmp+=to_string(right-left)+s[left]; left=right; } s=tmp; } return s; } };

2.5数青蛙

算法思路:

模拟青蛙叫声,两种情况:

●只有连续的发出叫声才算成功。当遇到'r''o''a''k'这四个字符时,我们要去查看每个字符对应的前驱字符,有没有青蛙交出来。若有青蛙叫出来,那就让这个青蛙接下来喊出这个字符;若没有,返回-1;

●因为要返回青蛙的最小个数,即同一青蛙可能叫多次。当遇到'c'字符时,我们需要查看'k'字符有没有青蛙叫出来,若有就让此青蛙继续去叫'c';若没有,就重新添加青蛙。

class Solution { public: int minNumberOfFrogs(string croakOfFrogs) { string s="croak"; int n=s.size(); vector<int> hash(n);//数组模拟哈希表 unordered_map<char,int> index;//[x,x]表示这个字符的下标 for(int i=0;i<n;i++) index[s[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]; } };

Read more

算法训练之哈希表

算法训练之哈希表

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥✨✨✨✨✨✨ 个人主页✨✨✨✨✨✨         这一篇博客开启算法学习的另外一个篇章——哈希表,准备好了吗~我们发车去探索算法的奥秘啦~🚗🚗🚗🚗🚗🚗 目录 前言😁 哈希表基础概念😍    适用场景😊 实现方式😁 关键注意事项😜 容器使用参考博客🐷 两数之和😊 判断是否为字符串重排😋 存在重复元素Ⅱ🤪 字母异位词分组😀 总结🙃 前言😁 哈希表基础概念😍            哈希表是一种用于存储数据的容器,本质是通过键值对(key-value)的形式组织数据。它的核心优势在于能实现元素的快速查找,理想情况下时间复杂度可达 O(1),远超二分查找的 O(log N)。 适用场景😊         当需要频繁查找某个特定元素时(例

By Ne0inhk
金融风控系统:实时规则引擎内核、决策树物理建模与 Drools 性能压榨

金融风控系统:实时规则引擎内核、决策树物理建模与 Drools 性能压榨

文章目录 * 🎯🔥 金融风控系统:实时规则引擎内核、决策树物理建模与 Drools 性能压榨 * 📊📋 第一章:引言——金融风控的物理本质与“逻辑爆炸”效应 * 🧬🧩 1.1 决策链路的“高维打击” * 🛡️⚖️ 1.2 “逻辑爆炸”产生的物理损耗 * 🌍📈 第二章:内核解构——Drools 引擎的工作原理与 RETE 算法的物理路径 * 🧬🧩 2.1 RETE 算法:空间的艺术换取时间的极致 * 🛡️⚖️ 2.2 节点的物理职能拆解 * 🔄🎯 第三章:精密工程——决策树(Decision Tree)的逻辑建模与 DSL 封装 * 🧬🧩 3.1 决策树的物理拓扑 * 🛡️⚖️ 3.2 领域特定语言(DSL)的抽象:让逻辑回归业务

By Ne0inhk

深入浅出 PID 算法:原理、实现与应用实战

在工业控制、机器人运动控制、智能家居温控等场景中,PID 算法一直是当之无愧的 “控制利器”。它结构简单、鲁棒性强、参数调整灵活,即使在复杂的非线性系统中,也能实现稳定的闭环控制。本文将从原理到实战,带你彻底搞懂 PID 算法。 一、PID 算法是什么? PID 是 Proportional(比例)、Integral(积分)、Derivative(微分) 的缩写,它是一种闭环控制算法,核心思想是通过偏差(设定值与实际值的差值) 来计算控制量,从而让系统的实际输出无限接近设定值。 举个简单的例子:你想让空调把室温稳定在 25℃(设定值),但当前室温是 30℃(实际值),偏差就是 25-30 = -5℃。PID 控制器会根据这个偏差,自动调整空调的制冷功率,最终让室温稳定在 25℃。 PID 算法的核心公式(连续域)

By Ne0inhk
LeetCode——滑动窗口(初阶)

LeetCode——滑动窗口(初阶)

文章目录 * 简要介绍 * 相关例题 * 长度最小的子数组 * 题目描述 * 题目分析 * 实现思路💡 * 实现代码 * 无重复字符的最长子串 * 题目描述 * 题目分析 * 实现思路💡 * 实现代码 * [最大连续1的个数 III](https://gitee.com/link?target=https://leetcode.cn/problems/max-consecutive-ones-iii/) * 题目描述 * 题目分析 * 实现思路💡 * 实现代码 * [将 x 减到 0 的最小操作数](https://leetcode.cn/problems/minimum-operations-to-reduce-x-to-zero/) * 题目描述 * 题目描述 * 实现思路💡 * 实现代码 简要介绍 我们的滑动窗口算法是我们在笔试面试以及算法竞赛中都比较常见的一种算法,这个算法

By Ne0inhk