模拟算法(1)_替换所有的问号

news2024/10/3 18:53:00

个人主页:C++忠实粉丝
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C++忠实粉丝 原创

模拟算法(1)_替换所有的问号

收录于专栏【经典算法练习】
本专栏旨在分享学习算法的一点学习笔记,欢迎大家在评论区交流讨论💌

目录

1. 模拟算法简介 : 

1.1 定义与基本概念 

1.2 模拟算法的类型 

1.3 应用领域 

1.4 模拟算法的优点与缺点 

1.5 实现与工具 

1.6 未来发展 

2. 题目链接 :

3. 题目描述 :

4. 解法(模拟) :

    算法思路 :

    代码展示 :

    结果分析 :


1. 模拟算法简介 : 

    模拟算法(Simulation Algorithm)是一种通过模仿真实世界系统或过程来解决问题的计算方法。模拟算法广泛应用于各种领域,包括工程、科学、经济学、交通、气象等,尤其是在难以使用解析方法获得解决方案的问题中。 

1.1 定义与基本概念 

模拟算法是指通过构建模型来模拟一个系统的行为和过程,从而进行分析和预测。模拟通常涉及以下几个步骤:

建模:创建一个代表实际系统的数学或计算机模型。
执行模拟:使用计算机程序或手动方式运行模型,观察系统的行为。
分析结果:收集和分析模拟输出,以获取有关系统性能或行为的信息。

1.2 模拟算法的类型 

模拟算法可以分为几种类型: 

离散事件模拟(Discrete Event Simulation, DES):

    关注系统中事件的发生,事件在时间上是离散的。例如,排队系统、生产线等。
连续模拟(Continuous Simulation):

    模拟变化是连续的,通常用于描述物理过程,如流体动力学、生态系统等。
蒙特卡洛模拟(Monte Carlo Simulation):

    通过随机抽样来估计系统的特性和行为,常用于风险评估和决策分析。
代理基础模拟(Agent - based Simulation):

    模拟个体(代理)在特定环境中进行交互,研究系统的整体行为。

1.3 应用领域 

    模拟算法的应用领域非常广泛,包括但不限于:

    工业工程:用于优化生产流程和资源配置。
    交通管理:模拟交通流、交通信号控制等。
    金融:用于风险评估、投资组合优化和期权定价。
    环境科学:模拟生态系统变化、气候变化等。
    医学:用于疾病传播模型、公共卫生政策评估等。

1.4 模拟算法的优点与缺点 

优点:
    灵活性:能够模拟复杂系统,适用于解析方法难以解决的问题。
    可视化:模拟结果可视化,便于理解和分析系统行为。
    实验能力:可以在不干扰真实系统的情况下进行虚拟实验。
缺点:
    计算成本:复杂系统的模拟可能需要大量的计算资源。
    准确性依赖:模型的准确性和可靠性取决于初始假设和输入数据的质量。
    时间消耗:某些模拟可能需要较长的时间来执行。

1.5 实现与工具 

实现模拟算法通常需要编程能力,常用的编程语言和工具包括:

    编程语言:Python、R、MATLAB、Java、C++等。
    专用软件:如 AnyLogic、Simul8、Arena 等。
    数据分析工具:如 Tableau、Excel、R、Python 的数据分析库等。

1.6 未来发展 

        随着计算能力的提升和大数据技术的发展,模拟算法在实时系统分析、智能决策支持等领域的应用将越来越广泛。同时,结合人工智能和机器学习技术,模拟算法的预测能力和效率也将进一步提升。

        总之,模拟算法是一种强大的工具,能够帮助我们更好地理解和优化复杂系统的行为。通过合理的建模和模拟,可以为实际决策提供有力的支持。

2. 题目链接 :

OJ链接 : 替换所有的问号

3. 题目描述 :

给你一个仅包含小写英文字母和 '?' 字符的字符串 s,请你将所有的 '?' 转换为若干小写字母,使最终的字符串不包含任何 连续重复 的字符。

注意:你 不能 修改非 '?' 字符。

题目测试用例保证  '?' 字符 之外,不存在连续重复的字符。

在完成所有转换(可能无需转换)后返回最终的字符串。如果有多个解决方案,请返回其中任何一个。可以证明,在给定的约束条件下,答案总是存在的。

示例 1:

输入:s = "?zs"
输出:"azs"
解释:该示例共有 25 种解决方案,从 "azs" 到 "yzs" 都是符合题目要求的。只有 "z" 是无效的修改,因为字符串 "zzs" 中有连续重复的两个 'z' 。

示例 2:

输入:s = "ubv?w"
输出:"ubvaw"
解释:该示例共有 24 种解决方案,只有替换成 "v" 和 "w" 不符合题目要求。因为 "ubvvw" 和 "ubvww" 都包含连续重复的字符。

提示:

  • 1 <= s.length <= 100

  • s 仅包含小写英文字母和 '?' 字符

4. 解法(模拟) :

    算法思路 :

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

细节问题: 

我们每次判断都需要比较当前字符的前一个和后一个,但是当我们当前字符为首字符或者是最后一个字符时,我们这样判断就会访问过界,所以我们需要加上边界判断.

    代码展示 :

class Solution {
public:
    string modifyString(string s) {
        for(int i = 0; i < s.size(); i++)
        {
            if(s[i] == '?')
            {
                char ch;
                for(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;
    }
};

替换逻辑: 

对于每个 '?',尝试用 'a' 到 'z' 中的字母进行替换。通过 for (ch = 'a'; ch <= 'z'; ch++) 遍历字母。
在循环中,首先检查字符 ch 是否与前一个字符(s[i - 1])不同,且与后一个字符(s[i + 1])不同。具体条件是:
   i == 0 || ch != s[i - 1]:如果是字符串的第一个字符,或者 ch 与前一个字符不同。
   i == s.size() - 1 || ch != s[i + 1]:如果是字符串的最后一个字符,或者 ch 与后一个字符不同。
如果这两个条件都满足,说明选择的字母 ch 是有效的,可以替换当前的 '?',然后用 s[i] = ch; 更新字符,并通过 break; 跳出字母循环。 

 

    结果分析 :

代码的时间复杂度分析
    外层循环:遍历字符串的每个字符,复杂度为 O(n),其中 n 是字符串的长度。
    内层循环:对于每个 '?',最坏情况下需要遍历 26 个字母(从 'a' 到 'z')。因此,最坏情况下,内层循环的时间复杂度是 O(26),即常数时间 O(1)。
    总体时间复杂度为:O(n)。

代码的空间复杂度
    空间复杂度:该算法只使用了常数的额外空间来存储字符 ch,因此空间复杂度为 O(1)。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MHA携手Atlas:打造高效读写分离解决方案,引领数据库性能飞跃

作者简介&#xff1a;我是团团儿&#xff0c;是一名专注于云计算领域的专业创作者&#xff0c;感谢大家的关注 座右铭&#xff1a; 云端筑梦&#xff0c;数据为翼&#xff0c;探索无限可能&#xff0c;引领云计算新纪元 个人主页&#xff1a;团儿.-CSDN博客 目录 前言&#…

npm切换到淘宝镜像

1、输入以下命令后回车&#xff0c;npm切换至淘宝镜像 npm config set registry https://registry.npmmirror.com 2、输入以下命令后回车&#xff0c;检查是否切换成功 npm config get registry 若返回此信息&#xff0c;表示切换成功 3、切换后就可使用淘宝镜像加快npm包的…

C语言 | Leetcode C语言题解之第447题回旋镖的数量

题目&#xff1a; 题解&#xff1a; int cmpfunc(const void *a, const void *b) {return (*(int *)a - *(int *)b); } //计算组合数*2 int every(int count) {if (count 1) {return 0;} else {return count * (count - 1);} } //计算每个锚点能产生的回旋镖总数 int part(in…

【嵌入式系统】第18章 脉宽调试器(PWM)

目录 18.1 结构框图 18.3 功能说明 18.3.4 PWM 信号发生器 18.3.5 死区发生器 18.3.6 中断/ADC 触发选择器 18.3.7 同步方法 18.3.8 故障条件 18.3.9 输出控制块 LES 硬件介绍&#xff08;12&#xff09;正交编码接口QEI 19.1 结构框图 19.2 信号描述 19.3 功能说明…

4M-21: An Any-to-Any Vision Model for Tens of Tasks and Modalities论文精度

贡献&#xff1a;在21种高度不同的模态中训练一个统一的模型&#xff0c;并且对比专有模型不会有性能损失做法&#xff1a;将不同模态映射到不同的token空间&#xff0c;并且可以生成不同的模态token【Any-to-any】关键点&#xff1a;如何在不同的模态中应用tokenization进行映…

【MySQL 07】内置函数

目录 1.日期函数 日期函数使用场景&#xff1a; 2.字符串函数 字符串函数使用场景&#xff1a; 3.数学函数 4.控制流函数 1.日期函数 函数示例&#xff1a; 1.在日期的基础上加日期 在该日期下&#xff0c;加上10天。 2.在日期的基础上减去时间 在该日期下减去2天 3.计算两…

【MySQL】服务器管理与配置

MySQL服务器 服务器默认配置 查看服务器默认选项和系统变量 mysqld --verbose --help 查看运行时的系统变量&#xff0c;可以通过like去指定自己要查询的内容 状态变量的查看 系统变量和状态变量的作用域 全局作用域&#xff1a; 对于每个会话都会生效当前会话&#xff1a;只…

通信工程学习:什么是SNMP简单网络管理协议

SNMP&#xff1a;简单网络管理协议 SNMP&#xff08;Simple Network Management Protocol&#xff0c;简单网络管理协议&#xff09;是一种用于在计算机网络中管理网络节点&#xff08;如服务器、工作站、路由器、交换机等&#xff09;的标准协议。它属于OSI模型的应用层&#…

TIM的PWM模式

定时器的工作流程: 定时器对时钟传来的脉冲次数计数&#xff0c;并且在次数到达范围值时触发中断。如向下计数模式时为0&#xff0c;向上计数为达到自动重装载计时器的值时触发中断。 STM32里面的定时器有多个定时器。 如TIM1、TIM2、TIM3 定时器的输入捕获模式来测量输…

我为什么决定关闭ChatGPT的记忆功能?

你好&#xff0c;我是三桥君 几个月前&#xff0c;ChatGPT宣布即将推出一项名为“记忆功能”的新特性&#xff0c;英文名叫memory。 这个功能听起来相当吸引人&#xff0c;宣传口号是让GPT更加了解用户&#xff0c;仿佛是要为我们每个人量身打造一个专属的AI助手。 在记忆功…

【笔记】平面

一、平面及其方程&#xff08;3个条件&#xff0c;4种表达&#xff09; F ( x , y , z ) F(x,y,z) F(x,y,z)为平面方程&#xff1a; 在这个平面上的点满足 F ( x , y , z ) 0 F(x,y,z)0 F(x,y,z)0不在这个平面上的点不满足 F ( x , y , z ) 0 F(x,y,z)0 F(x,y,z)0 归根结底&…

Python 课程23-LibROSA

前言 LibROSA 是一个用于音频分析的 Python 库&#xff0c;特别擅长音乐信号处理和音频特征提取。它提供了广泛的工具来处理音频文件&#xff0c;包括加载、变换、特征提取、可视化等功能。LibROSA 在音乐信息检索&#xff08;MIR&#xff09;、机器学习中的音频预处理和音频信…

java发送邮件email实战

1.首先在项目中增加依赖&#xff0c;在pom文件中添加如下坐标 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency>2.发邮件工具类如下 package com.example.demo.…

安卓13默认使用大鼠标 与配置分析 andriod13默认使用大鼠标 与配置分析

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改5.彩蛋1.前言 android13里面的鼠标貌似比以前版本的鼠标小了,有些客户想要把这个鼠标改大。这个功能,android有现成的,就在这里,设置 =》无障碍 =》色彩和动画 =》 大号鼠标指针。 我们通过…

JavaWeb - 8 - 请求响应 分层解耦

请求响应 请求&#xff08;HttpServletRequest&#xff09;&#xff1a;获取请求数据 响应&#xff08;HttpServletResponse&#xff09;&#xff1a;设置响应数据 BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式。客户端只需要浏览器&#xff0c;应用程…

【解决方案】关于 UART 接收数据时丢失数据的解决办法——环形缓冲存储区

文章目录 UART 通信丢失数据的常见原因总结串口&#xff08;UART&#xff09;数据丢失 Bug 的复现引入环形队列解决数据丢失问题总结 在嵌入式系统和物联网&#xff08;IoT&#xff09;设备中&#xff0c;串行通信是一种非常普遍且重要的数据传输方式。无论是通过 UART、RS-232…

【Godot4.3】基于中心点连线的矩形重叠检测

概述 这个方法是我自己想到的&#xff0c;经典的矩形重叠&#xff08;碰撞&#xff09;检测&#xff0c;是一段很复杂的逻辑判断&#xff0c;而根据两个矩形中点连线&#xff0c;与两个矩形宽度和高度之和一半的比较&#xff0c;就可以判断两个矩形是否重叠&#xff0c;并且能…

SQL进阶技巧:统计各时段观看直播的人数

目录 0 需求描述 1 数据准备 2 问题分析 3 小结 如果觉得本文对你有帮助&#xff0c;那么不妨也可以选择去看看我的博客专栏 &#xff0c;部分内容如下&#xff1a; 数字化建设通关指南 专栏 原价99&#xff0c;现在活动价39.9&#xff0c;十一国庆后将上升至59.9&#…

TransFormer 视频笔记

TransFormer BasicsAttention单头注意力 single head attentionQ&#xff1a; query 查寻矩阵 128*12288K key matrix 128*12288SoftMax 归一 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/19e3cf1ea28442eca60d5fc1303921f4.png)Value matrix 12288*12288 MLP Bas…

边缘概率 | 条件概率

关于什么是边缘概率分布和条件概率分布&#xff0c;在理论上&#xff0c;我自己也还没有理解&#xff0c;那么现在就根据我学习到的理解方式来记录一下&#xff0c;有错误指出&#xff0c;请大家指正&#xff01;&#xff01;&#xff01; 例如&#xff0c;一个箱子里有十个乒乓…