跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
C++算法

模拟算法实战:替换问号、提莫攻击、Z 字形变换等五题详解

模拟算法专题涵盖替换问号、提莫攻击、Z 字形变换、外观数列及数青蛙五个经典题目。通过 C++ 实现展示字符串遍历、时间区间差值计算、字符排列规律寻找及状态变化统计方法。重点在于理解贪心策略、周期性规律和有限状态机等逻辑模型,帮助读者掌握模拟类问题的通用解题思路。

HadoopMan发布于 2026/3/24更新于 2026/5/46 浏览
模拟算法实战:替换问号、提莫攻击、Z 字形变换等五题详解

模拟算法实战:替换问号、提莫攻击、Z 字形变换等五题详解

039 替换所有的问号

题目描述: 给定一个字符串 s,其中包含小写字母和问号 ?。你需要将所有的问号替换为小写字母,使得最终字符串中不包含连续重复的字符。

解题思路

采用贪心策略遍历字符串。遇到问号时,尝试用 a 到 z 中的字符进行替换。选择字符的关键在于它不能与前后相邻的字符相同。由于只有三个位置(前、后、当前)需要避开,而字母表有 26 个字符,总能找到一个满足条件的字符。

C++ 实现

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

040 提莫攻击

题目描述: 在《英雄联盟》中,提莫的攻击会使目标中毒。给定攻击时间序列 timeSeries 和中毒持续时间 duration,计算总中毒时间。

解题思路

核心在于处理重叠的时间段。遍历攻击时间点,比较当前攻击与上一次攻击的时间差:

  1. 如果时间差大于等于 duration,说明上次中毒已完全结束,累加完整时长。
  2. 如果时间差小于 duration,说明上次中毒被中断,只累加时间差部分。 最后别忘了加上最后一次攻击的完整中毒时长。

C++ 实现

  {
:
    {
         ret = ;
         n = timeSeries.();
         (n == )  ;
        
         ( i = ; i < n; i++) {
             x = timeSeries[i] - timeSeries[i - ];
             (x >= duration) {
                ret += duration;
            }  {
                ret += x;
            }
        }
        
         ret + duration;
    }
};
class
Solution
public
int findPoisonedDuration(vector<int>& timeSeries, int duration)
int
0
int
size
if
0
return
0
for
int
1
int
1
if
else
// 加上最后一次攻击的完整时长
return

041 Z 字形变换

题目描述: 将字符串按照给定的行数 numRows 以 Z 字形排列,然后按行读取生成新字符串。

解题思路

观察 Z 字形的规律,可以发现字符是按周期循环填充的。周期长度 T = 2 * numRows - 2。

  • 首行和末行:每隔 T 个字符取一个。
  • 中间行:每两个字符一组,分别位于第 k 个和第 T-k 个偏移量处。

我们可以直接通过数学公式计算每一行的索引,无需构建二维数组,从而优化空间复杂度。

表格辅助理解

当 row = 4 时,周期 T = 6:

行号数字序列(用 T 表示)说明
i=00, T, 2T公差为 T 的等差数列
i=11, T-1, T+1, 2T-1...围绕 T 的倍数对称
i=22, T-2, T+2, 2T-2...同上
i=33, T+3, 2T+3公差为 T 的等差数列

C++ 实现

class Solution {
public:
    string convert(string s, int numRows) {
        if (numRows == 1) return s;
        
        string ret;
        int d = 2 * numRows - 2;
        int n = s.size();
        
        // 1. 处理第一行
        for (int i = 0; i < n; i += d) ret += s[i];
        
        // 2. 处理中间行
        for (int k = 1; k < numRows - 1; k++) {
            for (int i = k, j = d - k; i < n || j < n; i += d, j += d) {
                if (i < n) ret += s[i];
                if (j < n) ret += s[j];
            }
        }
        
        // 3. 处理最后一行
        for (int i = numRows - 1; i < n; i += d) ret += s[i];
        
        return ret;
    }
};

042 外观数列

题目描述: 给定整数 n,返回外观数列的第 n 项。该数列由递归规则生成:每一项是对前一项的描述。

解题思路

这是一个典型的递归或迭代模拟问题。我们需要统计上一轮字符串中连续相同字符的个数及其值,拼接成下一轮字符串。 例如:"1" -> "11" (1 个 1) -> "21" (2 个 1) -> "1211" (1 个 2, 1 个 1)。 使用双指针法遍历字符串即可高效完成统计。

C++ 实现

class Solution {
public:
    string countAndSay(int n) {
        string ret = "1";
        for (int i = 1; i < n; i++) {
            string tmp;
            int len = ret.size();
            for (int left = 0, right = 0; right < len;) {
                while (right < len && ret[left] == ret[right]) right++;
                tmp += to_string(right - left) + ret[left];
                left = right;
            }
            ret = tmp;
        }
        return ret;
    }
};

043 数青蛙

题目描述: 给定字符串 croakOfFrogs,由字符 'c', 'r', 'o', 'a', 'k' 组成,代表青蛙叫声。求最少需要多少只青蛙才能发出这个叫声序列。

解题思路

这实际上是一个状态机问题。每只青蛙必须按顺序发出 c->r->o->a->k 的声音。

  • 维护一个计数器数组,记录处于各个发声阶段的青蛙数量。
  • 遇到 'c':如果有刚叫完 'k' 的青蛙复用,则减少其计数;否则新增一只青蛙。
  • 遇到其他字符:检查前驱状态是否有青蛙可用,若有则转移状态,否则非法。
  • 结束时所有青蛙应都回到 'k' 状态。

C++ 实现

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] > 0) hash[n - 1]--;
                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++) {
            if (hash[i] != 0) return -1;
        }
        return hash[n - 1];
    }
};

以上五个题目涵盖了模拟算法中的常见模式:贪心替换、区间合并、周期性规律、字符串压缩及状态机计数。掌握这些核心逻辑,能显著提升解决此类问题的效率。

目录

  1. 模拟算法实战:替换问号、提莫攻击、Z 字形变换等五题详解
  2. 039 替换所有的问号
  3. 解题思路
  4. C++ 实现
  5. 040 提莫攻击
  6. 解题思路
  7. C++ 实现
  8. 041 Z 字形变换
  9. 解题思路
  10. 表格辅助理解
  11. C++ 实现
  12. 042 外观数列
  13. 解题思路
  14. C++ 实现
  15. 043 数青蛙
  16. 解题思路
  17. C++ 实现
  • 💰 8折买阿里云服务器限时8折了解详情
  • GPT-5.5 超高智商模型1元抵1刀ChatGPT中转购买
  • 代充Chatgpt Plus/pro 帐号了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • 飞算 JavaAI:智能引导与协同交互驱动的 Java 开发提效实践
  • 腾讯云轻量应用服务器部署 OpenClaw 并接入 QQ 与飞书机器人
  • 高鋒集團合夥人黃俊瑯:以資本與生態賦能傳統企業 Web3 轉型
  • 机器人 DH 参数模型与正运动学详解
  • OpenAI 一致性模型:加速 AI 图像生成技术解析
  • Python 基础:列表与元组的区别及操作
  • 数据结构基础:插入排序与选择排序详解
  • 文心大模型 4.5 系列开源,解锁 AI 从封闭到开放的生态势能
  • RVC WebUI 全平台部署实战:10 分钟数据构建专业变声模型
  • CSS 样式基础与界面布局实战指南
  • 前端视频防录屏原理:EME DRM 机制与实战代码
  • 分裂二叉树的最大乘积
  • 前缀和技巧实战:和为 K 的子数组与和可被 K 整除的子数组
  • 二分查找实战:旋转排序数组最小值与点名问题解析
  • 二叉树算法实战:计算深度与求先序排列
  • Spring Boot + Vue 全栈开发实战指南
  • Java的数据类型与运算符详解
  • LLM 三角原则:简化大型模型应用开发与模型管理
  • 突破 LLM 上下文瓶颈:上下文内存虚拟化 CMV 的设计与实践
  • Coze 智能体搭建与发布全流程指南

相关免费在线工具

  • 加密/解密文本

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