• 什么是模拟?
    是一种通过模仿现实世界或问题场景的运行过程来求解问题的算法思想。它不依赖复杂的数学推导或逻辑优化,而是按照问题的实际规则、步骤或流程,一步步地 “复现” 过程,最终得到结果。
    使用场景:

当问题的逻辑规则明确、步骤可分解,且难以用数学公式直接求解时,模拟算法是直观有效的选择。常见场景包括:
过程性问题:如交通流量模拟、电梯运行调度、银行排队系统等;
规则性问题:如模拟棋牌游戏(围棋、扑克)的出牌逻辑、模拟电路时序等;
数值计算模拟:如天气预报中的大气环流模拟、物理实验中的粒子运动模拟等。
总结
模拟算法是一种 “按部就班” 的求解思路,通过复现问题的实际过程得到结果,适合规则明确、步骤可模拟的场景。它的优势在于直观和易实现,缺点是在大规模问题中可能效率较低,需根据具体场景权衡使用。

一. (1576.) 替换所有的问号

在这里插入图片描述
解法:
要求不能包含连续的重复字符,根据题目模拟,从前往后遍历整个字符串,找到问号之后就用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]))//巧妙的判断了头尾边界情况,不是边界情况时要满足i位置字符与左右两边不同{s[i] = ch;break;}}}}return s;}
};

二. (495.) 提莫攻击

在这里插入图片描述
模拟 + 分情况讨论。
计算相邻两个时间点的差值:
i. 如果差值⼤于等于中毒时间,说明上次中毒可以持续 duration 秒;
ii. 如果差值⼩于中毒时间,那么上次的中毒只能持续两者的差值。
注意:最后一次中毒时间要全部加上,因为没法与后一个元素计算差值

class Solution {
public:int findPoisonedDuration(vector<int>& t, int d) {int ret=0;for(int i=1;i<t.size();i++){int add=t[i]-t[i-1];//判断要增加的秒数if(add<d) ret+=add;else ret+=d;}//处理最后一个元素,秒数全部加上ret+=d;return ret;}
};

三. (6.) N 字形变换

在这里插入图片描述
算法原理:

  • 解法1模拟
    在这里插入图片描述

直接利用坐标规律填入数据,形成新字符串时也要再遍历一遍数组,总共需要两次,时间复杂度和空间复杂度都一样有点高

  • 解法2:找规律
    可以先通过具体行数的一个例证找到一种规律,再通过不同行数的例子来验证是否正确。

在这里插入图片描述
通过行数为4的情况来找规律
1.利用原字符串下标来进行找规律,就不需要遍历数组,直接在原字符串中操作添加到新字符串来提高效率。图中数组是为了方便找规律,不加入实际代码中
2.列数小于原字符串大小就够用,计算每一行元素之间的公差,找到规律并验证
3.第一行和最后一行的处理情况相同,中间行元素要两个两个一起递增相加
4.注意当行数等于1时的特殊情况,直接返回原字符串,避免进入死循环(公差为0)

class Solution {
public:string convert(string s, int n) {//处理特殊情况if(n==1) return s;//公差int d=2*n-2;string ret;//处理第一行元素for(int i=0;i<s.size();i+=d) ret+=s[i];//处理中间行元素for(int i=1;i<n-1;i++)//遍历中间每一行{for(int k=i,j=d-i;k<s.size()||j<s.size();k+=d,j+=d){//||保证有一个元素在范围内,添加时要先进性判断if(k<s.size()) ret+=s[k];if(j<s.size()) ret+=s[j];}}//处理最后一行元素for(int i=n-1;i<s.size();i+=d) ret+=s[i];return ret;}
};

四. (38.) 外观数列

在这里插入图片描述
解法:
利用双指针,开始都指向头位置,一个移动另一个不动,元素相等时后移直到不等时停止,计算差值即为不动指针所对应的元素个数,然后更新不动指针,如此循环往复

class Solution {
public:string countAndSay(int n) {string ret="1";for(int i=1;i<n;i++)// 解释 n - 1 次 ret 即可{string tmp;//用于记录下一项的临时变量,ret为当前解析的字符串int len=ret.size();int count=1;//统计连续相同字符的个数,最少出现一次for(int left=0,right=0;right<len;){// 移动right,找到与ret[left]不同的第一个位置while(right<len&&ret[left]==ret[right]) right++;count=right-left;// 拼接:"连续的个数" + "字符本身"tmp+=to_string(count)+ret[left];// 移动left到right的位置,开始统计下一组连续字符left=right;}ret=tmp;}return ret;}
};

解析:
得到外观数列第n项的结果,只需要解析前n-1项即可。第一项一定为1,所以从1开始解析,创建一个变量tmp来存储解析后作为下一次解析的字符串。内层循环中通过双指针遍历当前项,解析完后更新当前项,继续迭代下去

注意:
1.初始化方式完全不同

string ret=“1”:

是包含单个字符 ‘1’ 的字符串,ret.size() 为 1,ret[0] 为 ‘1’(ASCII 码值为 49)。

string ret{1}:

此时会调用 std::string 的另一个构造函数:string(size_t n, char c),该构造函数的含义是 “创建一个包含 n 个字符 c 的字符串”。 1 会被隐式转换为size_t 类型(无符号整数),作为第一个参数(字符个数),整数 1 会被当作 char 类型的 ASCII 码值,即 string ret{1}; 等价于 string ret(1, ‘\x01’),其中 ‘\x01’ 是 ASCII 码为 1 的控制字符(SOH,标题开始符)
这样初始化的结果是一个长度为 1 的字符串,但包含的字符是 ASCII 码为 1 的不可见控制字符(而非字符 ‘1’),ret[0] 的值为 1(十进制),而非 49。
本质:用整数对应的ASCII 码值初始化,字符串内容是该 ASCII 码对应的字符(通常是不可见的控制字符)。

2.字符串拼接逻辑
std::string的operator+=支持以下常见形式:
追加单个字符:ret += ‘a’
追加字符串:ret += “abc” 或 ret += another_str
不支持ret += {str1, str2}这种初始化列表形式,整数转为字符串要加to_string()

五. (1419.) 数⻘蛙

在这里插入图片描述

解法
在这里插入图片描述
◦ 当遇到 ‘r’ ‘o’ ‘a’ ‘k’ 这四个字符的时候,我们要去看看每⼀个字符对应的前驱字符,
有没有⻘蛙叫出来。如果有⻘蛙叫出来,那就让这个⻘蛙接下来喊出来这个字符;如果没有,直接返回 -1 ;
◦ 当遇到 ‘c’ 这个字符的时候,我们去看看 ‘k’ 这个字符有没有⻘蛙叫出来。如果有,就让这个⻘蛙继续去喊 ‘c’ 这个字符;如果没有的话,就重新搞⼀个⻘蛙。

  • if-else方法
    完全模拟上图过程即可,只需注意返回值时的多种情况
class Solution {
public:int minNumberOfFrogs(string croakOfFrogs) {int c=0,r=0,o=0,a=0,k=0;for(auto ch:croakOfFrogs){if(ch=='c'){if(k!=0){k--;c++;}else c++;}else if(ch=='r'){if(c!=0){c--;r++;}else return -1;}else if(ch=='o'){if(r!=0){r--;o++;}else return -1;}else if(ch=='a'){if(o!=0){o--;a++;}else return -1;}else if(ch=='k'){if(a!=0){a--;k++;}else return -1;}}//判断一次完整的蛙叫都没有if(k==0) return -1;//判断c不能满足一次蛙叫的情况,可以和除k以外的字符比较是否相等//不能和k比因为可以由一只蛙重复叫else if(c!=r) return -1;else return k;}
};
  • 哈希表方法
class Solution {
public:int minNumberOfFrogs(string croakOfFrogs) {string t="croak";int n=t.size();vector<int>hash(n);//用数组模拟哈希表unordered_map<char,int>index;//为了方便查找下标for(int i=0;i<n;i++){index[t[i]]=i;}for(auto ch:croakOfFrogs){if(ch=='c'){if(hash[n-1]) {hash[n-1]--;hash[0]++;}else 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++){//判断蛙叫是否有效,除k外必须都为0if(hash[i]) return -1;}return hash[n-1];}
};

适用于通用情况,当不知道给定字符串内容时适用,通过数组模拟哈希降低空间复杂度,再用哈希表存储字符所对应的下标,方便查找。循环时只用分两组,避免繁杂的情况讨论

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

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

相关文章

【FreeRTOS】刨根问底6: 应该如何防止任务栈溢出?

【加关注&#xff0c;不迷路】一、栈溢出&#xff1a;程序世界的“越界洪水”就象一个装水的玻璃杯&#xff08;栈空间&#xff09;&#xff0c;每次调用函数就像向水杯中倒水&#xff08;压入保护需要恢复的数据&#xff09;。当函数嵌套调用过深&#xff08;如递归失控&#…

牛客周赛 Round 105

A.小苯的xor构造题目描述小红喜欢整数 k&#xff0c;他想让小苯构造两个不相等的非负整数&#xff0c;使得两数的异或和等于 k。请你帮帮小苯。#include <bits/stdc.h> using namespace std; using ll long long; void solve() {int k;cin>>k;cout<<0<&l…

《R for Data Science (2e)》免费中文翻译 (第4章) --- Workflow: code style

写在前面 本系列推文为《R for Data Science (2)》的中文翻译版本。所有内容都通过开源免费的方式上传至Github&#xff0c;欢迎大家参与贡献&#xff0c;详细信息见&#xff1a; Books-zh-cn 项目介绍&#xff1a; Books-zh-cn&#xff1a;开源免费的中文书籍社区 r4ds-zh-cn …

11-verilog的RTC驱动代码

verilog的RTC驱动代码 1.例化parameter SLAVE_ADDR 7h51 ; // 器件地址 parameter BIT_CTRL 1b0 ; // 字地址位控制参数(16b/8b) parameter CLK_FREQ 26d50_000_000; // i2c_dri模块的驱动时钟频率(CLK_FREQ) parameter I2C_FR…

【k8s、docker】Headless Service(无头服务)

文章目录问题背景1、什么是Headless Service1.2 为什么 Zookeeper 使用 Headless Service&#xff1f;1.2 Headless Service 的 DNS 行为1.3 验证示例1.4 如何创建 Headless Service&#xff1f;2. zk-0.zookeeper.default.svc.cluster.local 域名是如何创建出来的&#xff1f;…

scikit-learn/sklearn学习|套索回归Lasso解读

【1】引言 前序学习进程中&#xff0c;对用scikit-learn表达线性回归进行了初步解读。 线性回归能够将因变量yyy表达成由自变量xxx、线性系数矩阵www和截距bbb组成的线性函数式&#xff1a; y∑i1nwi⋅xibwTxby\sum_{i1}^{n}w_{i}\cdot x_{i}bw^T{x}byi1∑n​wi​⋅xi​bwTxb实…

暴雨服务器:以定制化满足算力需求多样化

在数字经济与实体经济深度融合的浪潮下&#xff0c;互联网行业正经历着前所未有的技术变革。大数据分析、云计算服务、人工智能算法等技术的快速演进&#xff0c;推动着企业对于高性能计算基础设施的需求呈现指数级增长。据IDC数据显示&#xff0c;互联网行业已成为全球服务器采…

JavaScript字符串详解

创建字符串&#xff1a; 1.使用字面量(推荐)&#xff1a; 这是最常用、最直接的方式。你可以用单引号 ()、双引号 (") 或反引号 () 把文本包起来 let singleQuote 单引号; let doubleQuote "双引号"; let templateLiteral 反引号;2.使用String 构造函数&…

Kiro Preview 应用评测

Kiro应用评测 Kiro 是一个由亚马逊推出的 AI 驱动的智能开发环境&#xff0c;从原型到生产全程陪伴您的开发过程。它将"灵感编程"的流畅性与规范的清晰性相结合&#xff0c;帮助您更快地构建更好的软件。 昨天收到了Kiro的试用邮件&#xff0c;收到邮件后第一时间下载…

Flink2.0学习笔记:Flink服务器搭建与flink作业提交

一&#xff0c;下载flink:Downloads | Apache Flink,解压后放入IDE工作目录&#xff1a;我这里以1.17版本为例 可以看到&#xff0c;flink后期的版本中没有提供window启动脚本:start-cluster.bat 所以这里要通过windows自带的wsl 系统启动它 打开终端依次运行下列命令完成w…

MySQL锁的分类

MySQL锁可以按照多个维度进行分类&#xff0c;下面我用最清晰的方式为你梳理所有分类方式&#xff1a;一、按锁的粒度分类&#xff08;最常用分类&#xff09;锁类型作用范围特点适用引擎示例场景表级锁整张表开销小、加锁快&#xff0c;并发度低MyISAM, MEMORY数据迁移、全表统…

电脑上搭建HTTP服务器在局域网内其它客户端无法访问的解决方案

在电脑上开发一套HTTP服务器的程序在调试时&#xff0c;在本机内访问正常&#xff0c;但是在本机外访问就不正常&#xff0c;外部客户端无法访问或无法连接到本机的服务器的问题&#xff0c;这可能涉及网络配置、防火墙、端口转发或服务绑定等问题&#xff0c;在这里提供了解决…

双指针和codetop2(最短路问题BFS)

双指针和codetop21.双指针1.[复写0](https://leetcode.cn/problems/duplicate-zeros/)2.动态规划1.[珠宝的最高价值](https://leetcode.cn/problems/li-wu-de-zui-da-jie-zhi-lcof/description/)2.[解码方法](https://leetcode.cn/problems/decode-ways/)3.[下降路径最小和](ht…

基于K邻近算法(KNN)的数据回归预测模型

一、作品详细简介 1.1附件文件夹程序代码截图 全部完整源代码&#xff0c;请在个人首页置顶文章查看&#xff1a; 学行库小秘_CSDN博客https://blog.csdn.net/weixin_47760707?spm1000.2115.3001.5343 1.2各文件夹说明 1.2.1 main.m主函数文件 该MATLAB代码实现了一个基于…

【123页PPT】化工行业数字化解决方案(附下载方式)

篇幅所限&#xff0c;本文只提供部分资料内容&#xff0c;完整资料请看下面链接 https://download.csdn.net/download/2501_92808859/91654005 资料解读&#xff1a;【123页PPT】化工行业数字化解决方案 详细资料请看本解读文章的最后内容。化工行业作为国民经济的重要支柱之…

c++--文件头注释/doxygen

文件头注释 开源项目&#xff1a; /*** file robot_base.cpp* author Mr.Wu* date 2025-05-28* version 1.0.0* brief Robot basic drive to communicate with controller** copyright Copyright (c) 2025 google.** Licensed under the Apache License, Version 2.…

【教程】笔记本安装FnOS设置合盖息屏不休眠

重装FnOS好几次了&#xff0c;合盖后屏幕关闭但不休眠的问题每次都要网上找参差不齐的教程&#xff0c;麻烦死了&#xff0c;索性记录一下方便以后复制粘贴。 使用root登录 sudo -i修改系统配置文件编辑logind.conf文件&#xff1a; 打开终端&#xff0c;输入以下命令以编辑log…

深入解析 Monkey OCR:本地化、多语言文本识别的利器与实践指南

在信息爆炸的时代&#xff0c;从图片、扫描文档中高效提取结构化文本的需求日益迫切。OCR&#xff08;光学字符识别&#xff09;技术成为解决这一问题的核心工具。尽管市面上有 Abbyy FineReader、Adobe Acrobat 等商业巨头&#xff0c;以及 Tesseract、PaddleOCR 等开源方案&a…

动态规划法 - 53. 最大子数组和

什么是动态规划法&#xff1f; 简单说&#xff0c;动态规划&#xff08;Dynamic Programming&#xff0c;简称 DP&#xff09; 是一种**「把复杂问题拆解成小问题&#xff0c;通过解决小问题来解决大问题」**的方法。 核心思路有两个&#xff1a; 1.拆分问题&#xff1a;把原问…

STM32CUBEMX配置stm32工程

1.新建工程2.选择芯片3.配置各种片上外设和时钟4.创建工程5.根据文件内容进行修改工程注意&#xff1a;最好根据工程规范来做&#xff0c;因为有时我们需要更改配置并重新生成&#xff0c;如果不按规范来会导致部分代码会被系统清除&#xff0c;在工程中中有很多成对的BEGIN和E…