优选算法——模拟


👇作者其它专栏

《数据结构与算法》《算法》《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

Flutter 组件 oxy 适配鸿蒙 HarmonyOS 实战:响应式原子化状态管理,构建高性能局部刷新与副作用治理架构

Flutter 组件 oxy 适配鸿蒙 HarmonyOS 实战:响应式原子化状态管理,构建高性能局部刷新与副作用治理架构

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 oxy 适配鸿蒙 HarmonyOS 实战:响应式原子化状态管理,构建高性能局部刷新与副作用治理架构 前言 在鸿蒙(OpenHarmony)生态迈向极致流畅交互、涉及大量复杂实时仪表盘及超长列表渲染的背景下,如何实现状态的高效分发与局部更新,已成为决定应用“视口丝滑度”的核心架构命题。在鸿蒙设备这类强调 AOT 极致优化与 VSync 垂直同步波动的环境下,如果应用依然依赖全局的 setState 或过于沉重的树级状态注入(如传统的 Provider 模式),由于由于底层 OID 监听与 Widget 树重建带来的 CPU 抖动,极易由于由于“无效重绘”导致页面滚动时的微小掉帧。 我们需要一种能够实现原子化追踪、具备自动依赖收集且不依赖 Widget 树继承关系的极轻量响应方案。 oxy 为 Flutter

By Ne0inhk
开发兜不住?让数据库来兜底:金仓 SQL 防火墙的工程化实践

开发兜不住?让数据库来兜底:金仓 SQL 防火墙的工程化实践

开发兜不住?让数据库来兜底:金仓 SQL 防火墙的工程化实践 在真实的生产环境中,数据库安全从来不是“写完代码就结束”的问题,而是一个贯穿系统生命周期的持续对抗过程。哪怕你已经严格执行参数化查询、ORM 框架封装、输入校验等规范,仍然无法保证系统绝对无注入风险——遗留系统、动态 SQL、第三方组件、甚至临时脚本,都会成为潜在突破口。 这也是为什么越来越多企业开始将防线下沉到数据库层:既然应用层不可控,那就让数据库成为最后一道“强制执行的安全边界”。 本文结合 KingbaseES 的 SQL 防火墙机制,从原理、模式设计到性能表现,讲清楚它是如何在工程上解决 SQL 注入问题的。 一、SQL 注入的本质:语义劫持,而不是“字符串拼接问题” 很多人对 SQL 注入的理解还停留在“拼接字符串不安全”,但从数据库视角来看,本质其实是: 攻击者篡改了 SQL 的语义结构(

By Ne0inhk
Android 蓝牙 BLE 扫描 Native 层架构与扫描流程剖析

Android 蓝牙 BLE 扫描 Native 层架构与扫描流程剖析

博主简介 byte轻骑兵,现就职于国内知名科技企业,专注于嵌入式系统研发,深耕 Android、Linux、RTOS、通信协议、AIoT、物联网及 C/C++ 等领域。乐于技术分享与交流,欢迎关注互动! 📌 主页与联系方式ZEEKLOG:https://blog.ZEEKLOG.net/weixin_37800531知乎:https://www.zhihu.com/people/38-72-36-20-51微信公众号:嵌入式硬核研究所邮箱:[email protected](技术咨询或合作请备注需求) ⚠️ 版权声明 本文为原创内容,未经授权禁止转载。商业合作或内容授权请联系邮箱并备注来意。 本文基于 Android 蓝牙源码中 BLE 扫描相关的 Native 层代码,以scanInitializeNative为入口,系统梳理 BLE 扫描从 JNI

By Ne0inhk
【保姆级教程】手把手教你本地部署Open Claw,轻松实现智能爬虫![特殊字符]

【保姆级教程】手把手教你本地部署Open Claw,轻松实现智能爬虫![特殊字符]

🔥 前言 最近Open Claw在爬虫圈火得一塌糊涂!作为一款开源的高性能爬虫框架,它不仅支持分布式爬取,还内置了强大的反爬策略,简直是爬虫工程师的福音! 今天就带大家从零开始,在本地完整部署Open Claw,让你的爬虫效率直接起飞!💪 📝 准备工作 系统要求 * ✅ Windows 10/11 / macOS / Linux * ✅ Python 3.8+ * ✅ 8GB+ 内存(建议16GB) * ✅ 10GB+ 可用磁盘空间 需要安装的软件 1. Python环境(如果还没安装) 2. Git(用于克隆代码) 3. Docker(可选,推荐使用) 🚀 详细部署步骤 Step 1:安装Python依赖库 首先打开终端(Win+R输入cmd),执行以下命令: bash # 升级pip到最新版本 python -m pip

By Ne0inhk