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

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

LeetCode 1576 替换所有问号通过遍历字符串并尝试 a-z 字符填充问号,确保不与相邻字符重复;495 提莫攻击则需计算攻击间隔,若间隔小于中毒时长则累加间隔,否则累加完整时长,最后加上最后一次攻击的持续时间。两者均为典型的模拟类算法题,重点考察边界条件处理与逻辑分支判断。

岁月神偷发布于 2026/3/24更新于 2026/6/819 浏览
算法实战:替换所有问号与提莫攻击

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

今天我们来聊聊两道经典的模拟类算法题,分别是 LeetCode 1576'替换所有的问号'和 495'提莫攻击'。这两道题虽然场景不同,但核心都在于对边界条件和状态变化的细致处理。

1576. 替换所有的问号

题目要求: 给定一个字符串 s,其中包含小写英文字母和问号 ?。你需要将每个 ? 替换为一个小写字母,使得最终字符串中没有任何两个相邻字符是相同的。如果存在多个解,返回任意一个即可。

解题思路: 这道题的核心逻辑其实很直观,就是模拟替换过程。我们从头到尾遍历字符串,一旦遇到 ?,就尝试用 a 到 z 的字符去填充。关键约束条件是:新填入的字符不能等于它左边的字符(如果存在),也不能等于右边的字符(如果存在)。

这里有个细节需要注意:当 ? 位于字符串开头或结尾时,只需要检查一侧的邻居即可。由于字母表有 26 个字符,而最多只有 2 个邻居需要避开,所以一定能找到合适的字符。

C++ 代码实现:

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++) {
                    // 检查是否与左边或右边相同
                    // 注意边界条件:i==0 表示没有左边,i==n-1 表示没有右边
                    if ((i == 0 || s[i - 1] != ch) && 
                        (i == n - 1 || s[i + 1] != ch)) {
                        s[i] = ch;
                        break; // 找到合适的字符后立即跳出
                    }
                }
            }
        }
        return s;
    }
};

495. 提莫攻击

题目要求: 在《英雄联盟》的背景故事中,提莫的攻击会让艾希中毒。给定一个非递减的整数数组 timeSeries,表示每次攻击的时间点,以及一个整数 duration 表示中毒持续时间。计算艾希总共处于中毒状态的时间。

解题思路: 这是一个典型的区间合并问题,但我们可以用更简单的模拟方式解决。我们需要关注的是两次攻击之间的时间间隔。

  1. 间隔大于等于 duration:说明上一次中毒效果已经完全释放,中间有一段完全清醒的时间。此时累加完整的 duration。
  2. 间隔小于 duration:说明在下一次攻击前,上一次的中毒效果还没结束,被刷新了。此时只能累加实际的间隔时间。
  3. 最后一次攻击:无论间隔如何,最后一次攻击一定会带来完整的 duration 秒中毒时间,需要在循环结束后单独加上。

这种分情况讨论的方法能避免复杂的区间重叠计算,逻辑非常清晰。

C++ 代码实现:

class Solution {
public:
    int findPoisonedDuration(vector<int>& timeSeries, int duration) {
        int n = timeSeries.size();
        if (n == 0) return 0;
        
        int ret = 0;
        for (int i = 1; i < n; i++) {
            // 计算当前攻击与上一次攻击的时间差
            int diff = timeSeries[i] - timeSeries[i - 1];
            
            // 如果间隔小于中毒时长,只算间隔;否则算完整时长
            if (diff < duration) {
                ret += diff;
            } else {
                ret += duration;
            }
        }
        // 加上最后一次攻击带来的完整中毒时间
        return ret + duration;
    }
};

总结

这两道题都是考察基础逻辑和边界处理的典型例子。替换问号题重点在于遍历时的局部约束检查,而提莫攻击题则考验对时间轴上区间重叠关系的理解。掌握这类模拟思维,对于解决其他涉及状态流转的算法题很有帮助。

目录

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

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

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

更多推荐文章

查看全部
  • 马尔可夫决策过程 (MDP) 原理与代码实战案例
  • Parasoft C/C++test 启用 MISRA C++ 合规检查指南
  • Java 连接电科金仓数据库(KingbaseES)实战指南
  • Verilog 描述半加器:FPGA 硬件入门实战
  • Vue3 最常用的 20 道面试题总结及代码解析
  • Java8 国内 JDK 下载链接及华为镜像源地址
  • Python 核心技术点汇总:装饰器、拷贝及数据结构
  • openEuler 系统安装 Docker 容器完整教程
  • 从 Copilot 到 Agentic:大型组织如何重构人×AI×流程研发范式
  • HDFS 副本数管理指南:动态调整与性能评估
  • AWS Kiro 结合 AIClient-2-API 实现免费调用 Claude 模型实战
  • MCP 模型上下文协议:原理、架构与应用场景解析
  • Python 实战:Boss 直聘职位信息爬虫开发
  • Ubuntu 系统下 libwebkit2gtk-4.1-0 库安装指南
  • OCC Architecture in DFT Design
  • MySQL JDBC 连接 URL 参数详解与最佳实践
  • 小鹏 VLA 2.0 与 IRON 人形机器人技术解析
  • 线性代数与空间解析几何在几何体数据结构中的应用
  • 汇川机器人软件 RobotLab 常规操作
  • RAGFlow Python API 中文文档

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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