跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

算法实战:替换所有问号与提莫攻击详解

替换所有问号问题要求遍历字符串,用 a-z 字符替换问号并避开相邻重复字符;提莫攻击问题则需比较攻击间隔与中毒持续时间,累加有效中毒时长。两题核心均为模拟过程与边界情况处理,代码采用 C++ 实现,逻辑清晰且效率较高。

二进制发布于 2026/3/30更新于 2026/6/918 浏览
算法实战:替换所有问号与提莫攻击详解

算法实战:替换所有问号与提莫攻击详解

今天我们来聊聊两道经典的模拟类算法题,分别是 LeetCode 的「替换所有问号」和「提莫攻击」。这两道题虽然难度不高,但非常考验对边界条件的把控和逻辑的严密性。

1. 替换所有问号

题目描述: 给定一个字符串 s,其中包含小写字母和问号 ?。你需要将所有的 ? 替换为小写字母,使得最终字符串中不存在两个相邻字符相同的情况。如果有多种解法,返回任意一种即可。

解题思路: 这道题的核心在于模拟替换过程。我们只需要从左到右遍历字符串,一旦遇到问号,就尝试用 a 到 z 中的字符去替换它。关键约束是:替换后的字符不能等于前一个字符(如果存在),也不能等于后一个字符(如果存在)。

由于字母表有 26 个字符,而每个位置最多只有两个邻居需要避开,所以一定能找到合适的字符。通常从 a 开始尝试,找到第一个不冲突的字符即可。

代码实现:

class Solution {
public:
    string modifyString(string s) {
        int n = s.size();
        for (int i = 0; i < n; ++i) {
            if (s[i] == '?') {
                // 尝试 a-z 进行替换
                for (char ch = 'a'; ch <= 'z'; ++ch) {
                    // 检查是否与前后字符冲突
                    bool prevOk = (i == 0 || s[i - 1] != ch);
                    bool nextOk = (i == n - 1 || s[i + 1] != ch);
                    
                    if (prevOk && nextOk) {
                        s[i] = ch;
                        break; // 找到合适的字符后立即跳出
                    }
                }
            }
        }
        return s;
    }
};

这里有个细节要注意:在修改 s[i] 之后,后续的循环会用到这个新值作为'前一个字符'来判断下一个问号。所以直接在原字符串上修改是安全的,不需要额外空间。

2. 提莫攻击

题目描述: 假设艾希正在使用提莫的攻击,攻击时间序列为 timeSeries,每次攻击使目标中毒持续 duration 秒。如果在中毒期间再次攻击,中毒状态会重置并延长。请计算总的中毒时长。

解题思路: 这同样是一个模拟问题,但需要分情况讨论。我们可以遍历攻击时间序列,关注相邻两次攻击的时间间隔。

  • 间隔大于等于中毒时间:说明上一次攻击的中毒效果已经完全结束,这次攻击是全新的,直接累加完整的 duration。
  • 间隔小于中毒时间:说明上次攻击还在生效,新的攻击会覆盖剩余时间。此时实际贡献的时长仅为两次攻击的时间差。

最后别忘了加上最后一次攻击带来的完整 duration,因为后面没有后续攻击来截断它了。

代码实现:

class Solution {
public:
    int findPoisonedDuration(vector<int>& timeSeries, int duration) {
        int n = timeSeries.size();
        if (n == 0) return 0;
        
        int totalDuration = 0;
        for (int i = 1; i < n; ++i) {
            int interval = timeSeries[i] - timeSeries[i - 1];
            // 取间隔时间和持续时间的较小值
            totalDuration += min(interval, duration);
        }
        // 加上最后一次攻击的完整持续时间
        totalDuration += duration;
        return totalDuration;
    }
};

注意处理空数组的情况,虽然题目通常保证非空,但在工程实践中防御性编程很重要。另外,C++ 中 min 函数需要包含 <algorithm> 头文件。

总结

这两道题都体现了模拟算法的典型特征:按步骤执行,同时密切关注边界条件。

  • 替换所有问号:重点在于局部最优选择,只要避开左右邻居即可,贪心策略有效。
  • 提莫攻击:重点在于区间合并的逻辑,通过比较间隔与持续时间来决定累加值。

在实际面试或竞赛中,这类题目往往考察的是代码实现的简洁性和对特殊情况的处理能力。希望这些解析能帮你更好地掌握模拟类问题的解题套路。

目录

  1. 算法实战:替换所有问号与提莫攻击详解
  2. 1. 替换所有问号
  3. 2. 提莫攻击
  4. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • C++与Linux基础:语言特性上的文件操作
  • Rust 与 WebAssembly 实战:在浏览器与 Node.js 运行高性能代码
  • 绿联云 NAS 配置 WebDAV 实现公网访问与同步
  • 使用 Langchain-Chatchat 构建本地专属 GPT 助手
  • 深入理解次模函数(Submodular Function)在机器学习中的应用
  • Hugging Face Transformers 大模型开发实战指南
  • K-means 聚类算法:原理、步骤与 Python 实现
  • 二分查找(一):朴素二分
  • Java 多态深度剖析:从向上转型到向下转型及动态绑定
  • OpenClaw 实战:利用 AI 代理实现自动化盯盘与策略分析
  • 合并两个 Git 仓库并保留完整提交历史
  • 本地电脑部署 DeepSeek-R1 模型实战指南
  • 无人机目标检测数据集介绍:14751 张航拍图像与 YOLOv8 训练实战
  • 统一接口与成本优化:大模型接入实战指南
  • JS 与 Java 调用 Dify API 接口实战
  • C++ 基于哈希表封装 unordered_map 与 unordered_set
  • Java 集成 EasyExcel 实现数据导入导出
  • Spring MVC 响应处理与设置方法
  • AI Skill 编写教程
  • 零基础读懂大型语言模型的工作原理与训练机制

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online