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

LeetCode 1576 替换所有问号和 495 提莫攻击:模拟算法实战解析

替换所有问号问题需遍历字符串,遇到问号时尝试 a-z 填充,确保不与前后字符重复。提莫攻击问题通过计算攻击时间间隔,若间隔小于中毒时长则累加间隔,否则累加中毒时长,最后加上最后一次攻击的完整时长。两者均使用模拟法解决,重点在于边界条件判断与时间复杂度优化。

安卓系统发布于 2026/3/21更新于 2026/9/1063 浏览
LeetCode 1576 替换所有问号和 495 提莫攻击:模拟算法实战解析

39. 替换所有问号

题目描述

给定一个字符串 s,你需要将其中所有的问号 ? 替换为小写英文字母,使得替换后的字符串中不包含连续重复的字符。

思路分析

这道题的核心在于模拟替换过程。我们需要从左到右遍历字符串,一旦遇到问号,就尝试用 'a' 到 'z' 之间的字符进行填充。关键在于选择一个字符后,必须确保它既不与前面的字符相同,也不与后面的字符相同。

具体逻辑如下:

  1. 遍历字符串,定位到每一个 ?。
  2. 从 'a' 开始尝试替换。
  3. 检查当前字符是否与左侧邻居(如果存在)冲突,以及是否与右侧邻居(如果存在)冲突。
  4. 找到第一个不冲突的字符后立即填入并跳出循环,继续处理下一个问号。

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;
    }
};

40. 提莫攻击

题目描述

在《英雄联盟》的背景设定中,提莫的攻击会让敌人进入中毒状态。给定一个非递减的整数数组 timeSeries,表示提莫攻击的时间点,以及一个整数 duration 表示中毒持续时间。每次攻击都会重置中毒计时器。请计算艾希总共处于中毒状态的秒数。

思路分析

这是一个典型的模拟结合分情况讨论的问题。我们只需要关注相邻两次攻击的时间间隔即可。

对于任意两次相邻攻击 timeSeries[i-1] 和 timeSeries[i]:

  1. 如果时间间隔大于等于 duration,说明上一次中毒效果已经持续了完整的 duration 秒,中间没有重叠。
  2. 如果时间间隔小于 duration,说明下一次攻击在前一次中毒结束前就已经开始了,此时实际贡献的中毒时间是两者的时间差。

最后别忘了加上最后一次攻击带来的完整 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];
            // 取较小值:要么是中毒时长,要么是间隔时间
            ret += (diff < duration ? diff : duration);
        }
        // 加上最后一次攻击的完整中毒时间
        return ret + duration;
    }
};

总结

这两道题都采用了模拟的思想。第一题考察字符串遍历与边界条件的处理,第二题则侧重于区间合并的逻辑简化。在实际编码中,注意处理空数组或单元素数组的边界情况,能有效避免运行时错误。

目录

  1. 39. 替换所有问号
  2. 题目描述
  3. 思路分析
  4. C++ 代码实现
  5. 40. 提莫攻击
  6. 题目描述
  7. 思路分析
  8. C++ 代码实现
  9. 总结

更多推荐文章

查看全部
  • 基于 FastGPT 与 MCP 协议构建工具增强型 AI Agent
  • Git 在 Windows 系统上的安装与配置指南
  • FAIR plus 2026 机器人全产业链接会前瞻
  • SBUS 协议原理与实战应用(无人机/航模/机器人)
  • Hive 多租户管理:企业级部署方案
  • 4G Cat.1 模组赋能 AI 教育机器人:政策与技术的融合机遇
  • 基于统一 API 的大模型选型策略与成本优化实践
  • Python 爬虫实战:抓取小红书穿搭笔记
  • Qoder AI 编程工具从部署到深度使用实战详解
  • AI 零基础入门与实践完全指南
  • 医疗 AI 场景下逻辑回归算法深度解析
  • Java 响应式编程 Mono 接口详解
  • ChatGPT、Gemini 与 Spotify 教育版权益介绍
  • AMD Nitro-E 304M 轻量级扩散模型技术解析
  • 芋道商城 Uniapp 开源电商系统技术解析
  • 字节跳动 AI 产品经理三轮面试经验与通用问题解析
  • 使用 Python 实现每日新闻推送功能
  • GLM-4.7 基于 vLLM Ascend 的 12 项核心性能优化实战
  • 海螺 AI 多模态架构解析与 Python 接入指南
  • Whisper 模型本地化部署:版本下载与离线环境搭建

相关免费在线工具

  • 加密/解密文本

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